]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - binutils/objcopy.c
Fix a typo in "objcopy --help".
[thirdparty/binutils-gdb.git] / binutils / objcopy.c
CommitLineData
252b5132 1/* objcopy.c -- copy object file from input to output, optionally massaging it.
8c2bc687 2 Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
a0f19280 3 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010
252b5132
RH
4 Free Software Foundation, Inc.
5
6 This file is part of GNU Binutils.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
32866df7 10 the Free Software Foundation; either version 3 of the License, or
252b5132
RH
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program; if not, write to the Free Software
b43b5d5f
NC
20 Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, MA
21 02110-1301, USA. */
252b5132 22\f
3db64b00 23#include "sysdep.h"
252b5132
RH
24#include "bfd.h"
25#include "progress.h"
252b5132
RH
26#include "getopt.h"
27#include "libiberty.h"
3db64b00 28#include "bucomm.h"
252b5132 29#include "budbg.h"
5af11cab 30#include "filenames.h"
5fe11841 31#include "fnmatch.h"
f0312d39 32#include "elf-bfd.h"
252b5132 33#include <sys/stat.h>
6e2c86ac 34#include "libbfd.h"
0408dee6
DK
35#include "coff/internal.h"
36#include "libcoff.h"
252b5132 37
92dd4511
L
38/* FIXME: See bfd/peXXigen.c for why we include an architecture specific
39 header in generic PE code. */
40#include "coff/i386.h"
41#include "coff/pe.h"
42
43static bfd_vma pe_file_alignment = (bfd_vma) -1;
44static bfd_vma pe_heap_commit = (bfd_vma) -1;
45static bfd_vma pe_heap_reserve = (bfd_vma) -1;
46static bfd_vma pe_image_base = (bfd_vma) -1;
47static bfd_vma pe_section_alignment = (bfd_vma) -1;
48static bfd_vma pe_stack_commit = (bfd_vma) -1;
49static bfd_vma pe_stack_reserve = (bfd_vma) -1;
50static short pe_subsystem = -1;
51static short pe_major_subsystem_version = -1;
52static short pe_minor_subsystem_version = -1;
53
047c9024 54struct is_specified_symbol_predicate_data
252b5132 55{
047c9024
NC
56 const char *name;
57 bfd_boolean found;
252b5132
RH
58};
59
57938635
AM
60/* A list to support redefine_sym. */
61struct redefine_node
62{
63 char *source;
64 char *target;
65 struct redefine_node *next;
66};
67
594ef5db
NC
68typedef struct section_rename
69{
70 const char * old_name;
71 const char * new_name;
72 flagword flags;
73 struct section_rename * next;
74}
75section_rename;
76
77/* List of sections to be renamed. */
84e2f313 78static section_rename *section_rename_list;
594ef5db 79
84e2f313
NC
80static asymbol **isympp = NULL; /* Input symbols. */
81static asymbol **osympp = NULL; /* Output symbols that survive stripping. */
252b5132
RH
82
83/* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes. */
84static int copy_byte = -1;
85static int interleave = 4;
86
b34976b6
AM
87static bfd_boolean verbose; /* Print file and target names. */
88static bfd_boolean preserve_dates; /* Preserve input file timestamp. */
252b5132
RH
89static int status = 0; /* Exit status. */
90
91enum strip_action
92 {
93 STRIP_UNDEF,
84e2f313
NC
94 STRIP_NONE, /* Don't strip. */
95 STRIP_DEBUG, /* Strip all debugger symbols. */
96 STRIP_UNNEEDED, /* Strip unnecessary symbols. */
ed1653a7 97 STRIP_NONDEBUG, /* Strip everything but debug info. */
84e2f313 98 STRIP_ALL /* Strip all symbols. */
252b5132
RH
99 };
100
0af11b59 101/* Which symbols to remove. */
252b5132
RH
102static enum strip_action strip_symbols;
103
104enum locals_action
105 {
106 LOCALS_UNDEF,
84e2f313
NC
107 LOCALS_START_L, /* Discard locals starting with L. */
108 LOCALS_ALL /* Discard all locals. */
252b5132
RH
109 };
110
111/* Which local symbols to remove. Overrides STRIP_ALL. */
112static enum locals_action discard_locals;
113
114/* What kind of change to perform. */
115enum change_action
116{
117 CHANGE_IGNORE,
118 CHANGE_MODIFY,
119 CHANGE_SET
120};
121
122/* Structure used to hold lists of sections and actions to take. */
123struct section_list
124{
b34976b6
AM
125 struct section_list * next; /* Next section to change. */
126 const char * name; /* Section name. */
127 bfd_boolean used; /* Whether this entry was used. */
128 bfd_boolean remove; /* Whether to remove this section. */
129 bfd_boolean copy; /* Whether to copy this section. */
130 enum change_action change_vma;/* Whether to change or set VMA. */
131 bfd_vma vma_val; /* Amount to change by or set to. */
132 enum change_action change_lma;/* Whether to change or set LMA. */
133 bfd_vma lma_val; /* Amount to change by or set to. */
134 bfd_boolean set_flags; /* Whether to set the section flags. */
135 flagword flags; /* What to set the section flags to. */
252b5132
RH
136};
137
138static struct section_list *change_sections;
594ef5db 139
b34976b6
AM
140/* TRUE if some sections are to be removed. */
141static bfd_boolean sections_removed;
594ef5db 142
b34976b6
AM
143/* TRUE if only some sections are to be copied. */
144static bfd_boolean sections_copied;
252b5132
RH
145
146/* Changes to the start address. */
147static bfd_vma change_start = 0;
b34976b6 148static bfd_boolean set_start_set = FALSE;
252b5132
RH
149static bfd_vma set_start;
150
151/* Changes to section addresses. */
152static bfd_vma change_section_address = 0;
153
154/* Filling gaps between sections. */
b34976b6 155static bfd_boolean gap_fill_set = FALSE;
252b5132
RH
156static bfd_byte gap_fill = 0;
157
158/* Pad to a given address. */
b34976b6 159static bfd_boolean pad_to_set = FALSE;
252b5132
RH
160static bfd_vma pad_to;
161
f9d4ad2a
NC
162/* Use alternative machine code? */
163static unsigned long use_alt_mach_code = 0;
1ae8b3d2 164
4087920c
MR
165/* Output BFD flags user wants to set or clear */
166static flagword bfd_flags_to_set;
167static flagword bfd_flags_to_clear;
168
252b5132 169/* List of sections to add. */
252b5132
RH
170struct section_add
171{
172 /* Next section to add. */
173 struct section_add *next;
174 /* Name of section to add. */
175 const char *name;
176 /* Name of file holding section contents. */
177 const char *filename;
178 /* Size of file. */
179 size_t size;
180 /* Contents of file. */
181 bfd_byte *contents;
182 /* BFD section, after it has been added. */
183 asection *section;
184};
185
594ef5db 186/* List of sections to add to the output BFD. */
252b5132
RH
187static struct section_add *add_sections;
188
2593f09a
NC
189/* If non-NULL the argument to --add-gnu-debuglink.
190 This should be the filename to store in the .gnu_debuglink section. */
191static const char * gnu_debuglink_filename = NULL;
192
252b5132 193/* Whether to convert debugging information. */
b34976b6 194static bfd_boolean convert_debugging = FALSE;
252b5132
RH
195
196/* Whether to change the leading character in symbol names. */
b34976b6 197static bfd_boolean change_leading_char = FALSE;
252b5132
RH
198
199/* Whether to remove the leading character from global symbol names. */
b34976b6 200static bfd_boolean remove_leading_char = FALSE;
252b5132 201
aaad4cf3 202/* Whether to permit wildcard in symbol comparison. */
5fe11841
NC
203static bfd_boolean wildcard = FALSE;
204
d58c2e3a
RS
205/* True if --localize-hidden is in effect. */
206static bfd_boolean localize_hidden = FALSE;
207
16b2b71c
NC
208/* List of symbols to strip, keep, localize, keep-global, weaken,
209 or redefine. */
047c9024
NC
210static htab_t strip_specific_htab = NULL;
211static htab_t strip_unneeded_htab = NULL;
212static htab_t keep_specific_htab = NULL;
213static htab_t localize_specific_htab = NULL;
214static htab_t globalize_specific_htab = NULL;
215static htab_t keepglobal_specific_htab = NULL;
216static htab_t weaken_specific_htab = NULL;
57938635 217static struct redefine_node *redefine_sym_list = NULL;
252b5132 218
b34976b6
AM
219/* If this is TRUE, we weaken global symbols (set BSF_WEAK). */
220static bfd_boolean weaken = FALSE;
252b5132 221
1637cd90
JB
222/* If this is TRUE, we retain BSF_FILE symbols. */
223static bfd_boolean keep_file_symbols = FALSE;
224
d7fb0dd2
NC
225/* Prefix symbols/sections. */
226static char *prefix_symbols_string = 0;
227static char *prefix_sections_string = 0;
228static char *prefix_alloc_sections_string = 0;
229
d3e52d40
RS
230/* True if --extract-symbol was passed on the command line. */
231static bfd_boolean extract_symbol = FALSE;
232
9e48b4c6
NC
233/* If `reverse_bytes' is nonzero, then reverse the order of every chunk
234 of <reverse_bytes> bytes within each output section. */
235static int reverse_bytes = 0;
236
0408dee6
DK
237/* For Coff objects, we may want to allow or disallow long section names,
238 or preserve them where found in the inputs. Debug info relies on them. */
239enum long_section_name_handling
240 {
241 DISABLE,
242 ENABLE,
243 KEEP
244 };
245
246/* The default long section handling mode is to preserve them.
247 This is also the only behaviour for 'strip'. */
248static enum long_section_name_handling long_section_names = KEEP;
9e48b4c6 249
252b5132 250/* 150 isn't special; it's just an arbitrary non-ASCII char value. */
84e2f313
NC
251enum command_line_switch
252 {
253 OPTION_ADD_SECTION=150,
254 OPTION_CHANGE_ADDRESSES,
255 OPTION_CHANGE_LEADING_CHAR,
256 OPTION_CHANGE_START,
257 OPTION_CHANGE_SECTION_ADDRESS,
258 OPTION_CHANGE_SECTION_LMA,
259 OPTION_CHANGE_SECTION_VMA,
260 OPTION_CHANGE_WARNINGS,
261 OPTION_DEBUGGING,
262 OPTION_GAP_FILL,
263 OPTION_NO_CHANGE_WARNINGS,
264 OPTION_PAD_TO,
265 OPTION_REMOVE_LEADING_CHAR,
266 OPTION_SET_SECTION_FLAGS,
267 OPTION_SET_START,
268 OPTION_STRIP_UNNEEDED,
269 OPTION_WEAKEN,
270 OPTION_REDEFINE_SYM,
271 OPTION_REDEFINE_SYMS,
272 OPTION_SREC_LEN,
273 OPTION_SREC_FORCES3,
274 OPTION_STRIP_SYMBOLS,
bcf32829
JB
275 OPTION_STRIP_UNNEEDED_SYMBOL,
276 OPTION_STRIP_UNNEEDED_SYMBOLS,
84e2f313 277 OPTION_KEEP_SYMBOLS,
d58c2e3a 278 OPTION_LOCALIZE_HIDDEN,
84e2f313 279 OPTION_LOCALIZE_SYMBOLS,
0408dee6 280 OPTION_LONG_SECTION_NAMES,
7b4a0685
NC
281 OPTION_GLOBALIZE_SYMBOL,
282 OPTION_GLOBALIZE_SYMBOLS,
84e2f313
NC
283 OPTION_KEEPGLOBAL_SYMBOLS,
284 OPTION_WEAKEN_SYMBOLS,
285 OPTION_RENAME_SECTION,
286 OPTION_ALT_MACH_CODE,
287 OPTION_PREFIX_SYMBOLS,
288 OPTION_PREFIX_SECTIONS,
289 OPTION_PREFIX_ALLOC_SECTIONS,
290 OPTION_FORMATS_INFO,
291 OPTION_ADD_GNU_DEBUGLINK,
4087920c 292 OPTION_ONLY_KEEP_DEBUG,
1637cd90 293 OPTION_KEEP_FILE_SYMBOLS,
4087920c
MR
294 OPTION_READONLY_TEXT,
295 OPTION_WRITABLE_TEXT,
296 OPTION_PURE,
d3e52d40 297 OPTION_IMPURE,
9e48b4c6 298 OPTION_EXTRACT_SYMBOL,
92dd4511
L
299 OPTION_REVERSE_BYTES,
300 OPTION_FILE_ALIGNMENT,
301 OPTION_HEAP,
302 OPTION_IMAGE_BASE,
303 OPTION_SECTION_ALIGNMENT,
304 OPTION_STACK,
305 OPTION_SUBSYSTEM
84e2f313 306 };
252b5132
RH
307
308/* Options to handle if running as "strip". */
309
310static struct option strip_options[] =
311{
312 {"discard-all", no_argument, 0, 'x'},
313 {"discard-locals", no_argument, 0, 'X'},
314 {"format", required_argument, 0, 'F'}, /* Obsolete */
315 {"help", no_argument, 0, 'h'},
7c29036b 316 {"info", no_argument, 0, OPTION_FORMATS_INFO},
252b5132
RH
317 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
318 {"input-target", required_argument, 0, 'I'},
1637cd90 319 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
252b5132 320 {"keep-symbol", required_argument, 0, 'K'},
ed1653a7 321 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
252b5132
RH
322 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
323 {"output-target", required_argument, 0, 'O'},
af3bdff7 324 {"output-file", required_argument, 0, 'o'},
252b5132
RH
325 {"preserve-dates", no_argument, 0, 'p'},
326 {"remove-section", required_argument, 0, 'R'},
327 {"strip-all", no_argument, 0, 's'},
328 {"strip-debug", no_argument, 0, 'S'},
329 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
330 {"strip-symbol", required_argument, 0, 'N'},
331 {"target", required_argument, 0, 'F'},
332 {"verbose", no_argument, 0, 'v'},
333 {"version", no_argument, 0, 'V'},
5fe11841 334 {"wildcard", no_argument, 0, 'w'},
252b5132
RH
335 {0, no_argument, 0, 0}
336};
337
338/* Options to handle if running as "objcopy". */
339
340static struct option copy_options[] =
341{
2593f09a 342 {"add-gnu-debuglink", required_argument, 0, OPTION_ADD_GNU_DEBUGLINK},
252b5132
RH
343 {"add-section", required_argument, 0, OPTION_ADD_SECTION},
344 {"adjust-start", required_argument, 0, OPTION_CHANGE_START},
345 {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES},
346 {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
347 {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
d7fb0dd2 348 {"alt-machine-code", required_argument, 0, OPTION_ALT_MACH_CODE},
43a0748c 349 {"binary-architecture", required_argument, 0, 'B'},
252b5132
RH
350 {"byte", required_argument, 0, 'b'},
351 {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES},
352 {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR},
353 {"change-section-address", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS},
354 {"change-section-lma", required_argument, 0, OPTION_CHANGE_SECTION_LMA},
355 {"change-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_VMA},
356 {"change-start", required_argument, 0, OPTION_CHANGE_START},
357 {"change-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS},
358 {"debugging", no_argument, 0, OPTION_DEBUGGING},
359 {"discard-all", no_argument, 0, 'x'},
360 {"discard-locals", no_argument, 0, 'X'},
d3e52d40 361 {"extract-symbol", no_argument, 0, OPTION_EXTRACT_SYMBOL},
252b5132
RH
362 {"format", required_argument, 0, 'F'}, /* Obsolete */
363 {"gap-fill", required_argument, 0, OPTION_GAP_FILL},
7b4a0685
NC
364 {"globalize-symbol", required_argument, 0, OPTION_GLOBALIZE_SYMBOL},
365 {"globalize-symbols", required_argument, 0, OPTION_GLOBALIZE_SYMBOLS},
252b5132 366 {"help", no_argument, 0, 'h'},
4087920c 367 {"impure", no_argument, 0, OPTION_IMPURE},
7c29036b 368 {"info", no_argument, 0, OPTION_FORMATS_INFO},
252b5132
RH
369 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
370 {"input-target", required_argument, 0, 'I'},
371 {"interleave", required_argument, 0, 'i'},
1637cd90 372 {"keep-file-symbols", no_argument, 0, OPTION_KEEP_FILE_SYMBOLS},
d7fb0dd2
NC
373 {"keep-global-symbol", required_argument, 0, 'G'},
374 {"keep-global-symbols", required_argument, 0, OPTION_KEEPGLOBAL_SYMBOLS},
252b5132 375 {"keep-symbol", required_argument, 0, 'K'},
d7fb0dd2 376 {"keep-symbols", required_argument, 0, OPTION_KEEP_SYMBOLS},
d58c2e3a 377 {"localize-hidden", no_argument, 0, OPTION_LOCALIZE_HIDDEN},
d7fb0dd2
NC
378 {"localize-symbol", required_argument, 0, 'L'},
379 {"localize-symbols", required_argument, 0, OPTION_LOCALIZE_SYMBOLS},
0408dee6 380 {"long-section-names", required_argument, 0, OPTION_LONG_SECTION_NAMES},
252b5132
RH
381 {"no-adjust-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
382 {"no-change-warnings", no_argument, 0, OPTION_NO_CHANGE_WARNINGS},
ed1653a7 383 {"only-keep-debug", no_argument, 0, OPTION_ONLY_KEEP_DEBUG},
d7fb0dd2 384 {"only-section", required_argument, 0, 'j'},
252b5132
RH
385 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
386 {"output-target", required_argument, 0, 'O'},
387 {"pad-to", required_argument, 0, OPTION_PAD_TO},
d7fb0dd2
NC
388 {"prefix-symbols", required_argument, 0, OPTION_PREFIX_SYMBOLS},
389 {"prefix-sections", required_argument, 0, OPTION_PREFIX_SECTIONS},
390 {"prefix-alloc-sections", required_argument, 0, OPTION_PREFIX_ALLOC_SECTIONS},
252b5132 391 {"preserve-dates", no_argument, 0, 'p'},
4087920c
MR
392 {"pure", no_argument, 0, OPTION_PURE},
393 {"readonly-text", no_argument, 0, OPTION_READONLY_TEXT},
d7fb0dd2 394 {"redefine-sym", required_argument, 0, OPTION_REDEFINE_SYM},
92991082 395 {"redefine-syms", required_argument, 0, OPTION_REDEFINE_SYMS},
252b5132
RH
396 {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
397 {"remove-section", required_argument, 0, 'R'},
594ef5db 398 {"rename-section", required_argument, 0, OPTION_RENAME_SECTION},
9e48b4c6 399 {"reverse-bytes", required_argument, 0, OPTION_REVERSE_BYTES},
252b5132
RH
400 {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},
401 {"set-start", required_argument, 0, OPTION_SET_START},
d7fb0dd2
NC
402 {"srec-len", required_argument, 0, OPTION_SREC_LEN},
403 {"srec-forceS3", no_argument, 0, OPTION_SREC_FORCES3},
252b5132
RH
404 {"strip-all", no_argument, 0, 'S'},
405 {"strip-debug", no_argument, 0, 'g'},
406 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
bcf32829
JB
407 {"strip-unneeded-symbol", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOL},
408 {"strip-unneeded-symbols", required_argument, 0, OPTION_STRIP_UNNEEDED_SYMBOLS},
252b5132 409 {"strip-symbol", required_argument, 0, 'N'},
d7fb0dd2 410 {"strip-symbols", required_argument, 0, OPTION_STRIP_SYMBOLS},
252b5132
RH
411 {"target", required_argument, 0, 'F'},
412 {"verbose", no_argument, 0, 'v'},
413 {"version", no_argument, 0, 'V'},
414 {"weaken", no_argument, 0, OPTION_WEAKEN},
415 {"weaken-symbol", required_argument, 0, 'W'},
16b2b71c 416 {"weaken-symbols", required_argument, 0, OPTION_WEAKEN_SYMBOLS},
5fe11841 417 {"wildcard", no_argument, 0, 'w'},
4087920c 418 {"writable-text", no_argument, 0, OPTION_WRITABLE_TEXT},
92dd4511
L
419 {"file-alignment", required_argument, 0, OPTION_FILE_ALIGNMENT},
420 {"heap", required_argument, 0, OPTION_HEAP},
421 {"image-base", required_argument, 0 , OPTION_IMAGE_BASE},
422 {"section-alignment", required_argument, 0, OPTION_SECTION_ALIGNMENT},
423 {"stack", required_argument, 0, OPTION_STACK},
424 {"subsystem", required_argument, 0, OPTION_SUBSYSTEM},
252b5132
RH
425 {0, no_argument, 0, 0}
426};
427
428/* IMPORTS */
429extern char *program_name;
430
431/* This flag distinguishes between strip and objcopy:
432 1 means this is 'strip'; 0 means this is 'objcopy'.
0af11b59 433 -1 means if we should use argv[0] to decide. */
252b5132
RH
434extern int is_strip;
435
420496c1
NC
436/* The maximum length of an S record. This variable is declared in srec.c
437 and can be modified by the --srec-len parameter. */
438extern unsigned int Chunk;
439
440/* Restrict the generation of Srecords to type S3 only.
441 This variable is declare in bfd/srec.c and can be toggled
442 on by the --srec-forceS3 command line switch. */
b34976b6 443extern bfd_boolean S3Forced;
252b5132 444
d3ba0551
AM
445/* Forward declarations. */
446static void setup_section (bfd *, asection *, void *);
80fccad2 447static void setup_bfd_headers (bfd *, bfd *);
d3ba0551
AM
448static void copy_section (bfd *, asection *, void *);
449static void get_sections (bfd *, asection *, void *);
450static int compare_section_lma (const void *, const void *);
451static void mark_symbols_used_in_relocations (bfd *, asection *, void *);
452static bfd_boolean write_debugging_info (bfd *, void *, long *, asymbol ***);
453static const char *lookup_sym_redefinition (const char *);
594ef5db 454\f
252b5132 455static void
84e2f313 456copy_usage (FILE *stream, int exit_status)
252b5132 457{
8b53311e
NC
458 fprintf (stream, _("Usage: %s [option(s)] in-file [out-file]\n"), program_name);
459 fprintf (stream, _(" Copies a binary file, possibly transforming it in the process\n"));
6364e0b4 460 fprintf (stream, _(" The options are:\n"));
252b5132 461 fprintf (stream, _("\
d5bcb29d
NC
462 -I --input-target <bfdname> Assume input file is in format <bfdname>\n\
463 -O --output-target <bfdname> Create an output file in format <bfdname>\n\
8b31b6c4 464 -B --binary-architecture <arch> Set output arch, when input is arch-less\n\
d5bcb29d
NC
465 -F --target <bfdname> Set both input and output format to <bfdname>\n\
466 --debugging Convert debugging information, if possible\n\
467 -p --preserve-dates Copy modified/access timestamps to the output\n\
468 -j --only-section <name> Only copy section <name> into the output\n\
2593f09a 469 --add-gnu-debuglink=<file> Add section .gnu_debuglink linking to <file>\n\
d5bcb29d
NC
470 -R --remove-section <name> Remove section <name> from the output\n\
471 -S --strip-all Remove all symbol and relocation information\n\
2593f09a 472 -g --strip-debug Remove all debugging symbols & sections\n\
d5bcb29d
NC
473 --strip-unneeded Remove all symbols not needed by relocations\n\
474 -N --strip-symbol <name> Do not copy symbol <name>\n\
bcf32829
JB
475 --strip-unneeded-symbol <name>\n\
476 Do not copy symbol <name> unless needed by\n\
477 relocations\n\
6ea3dd37 478 --only-keep-debug Strip everything but the debug information\n\
d3e52d40 479 --extract-symbol Remove section contents but keep symbols\n\
e7f918ad 480 -K --keep-symbol <name> Do not strip symbol <name>\n\
1637cd90 481 --keep-file-symbols Do not strip file symbol(s)\n\
d58c2e3a 482 --localize-hidden Turn all ELF hidden symbols into locals\n\
d5bcb29d 483 -L --localize-symbol <name> Force symbol <name> to be marked as a local\n\
7b4a0685 484 --globalize-symbol <name> Force symbol <name> to be marked as a global\n\
16b2b71c 485 -G --keep-global-symbol <name> Localize all symbols except <name>\n\
d5bcb29d
NC
486 -W --weaken-symbol <name> Force symbol <name> to be marked as a weak\n\
487 --weaken Force all global symbols to be marked as weak\n\
a95b5cf9 488 -w --wildcard Permit wildcard in symbol comparison\n\
d5bcb29d
NC
489 -x --discard-all Remove all non-global symbols\n\
490 -X --discard-locals Remove any compiler-generated symbols\n\
491 -i --interleave <number> Only copy one out of every <number> bytes\n\
492 -b --byte <num> Select byte <num> in every interleaved block\n\
493 --gap-fill <val> Fill gaps between sections with <val>\n\
494 --pad-to <addr> Pad the last section up to address <addr>\n\
495 --set-start <addr> Set the start address to <addr>\n\
496 {--change-start|--adjust-start} <incr>\n\
497 Add <incr> to the start address\n\
498 {--change-addresses|--adjust-vma} <incr>\n\
499 Add <incr> to LMA, VMA and start addresses\n\
500 {--change-section-address|--adjust-section-vma} <name>{=|+|-}<val>\n\
501 Change LMA and VMA of section <name> by <val>\n\
502 --change-section-lma <name>{=|+|-}<val>\n\
503 Change the LMA of section <name> by <val>\n\
504 --change-section-vma <name>{=|+|-}<val>\n\
505 Change the VMA of section <name> by <val>\n\
506 {--[no-]change-warnings|--[no-]adjust-warnings}\n\
507 Warn if a named section does not exist\n\
508 --set-section-flags <name>=<flags>\n\
509 Set section <name>'s properties to <flags>\n\
510 --add-section <name>=<file> Add section <name> found in <file> to output\n\
594ef5db 511 --rename-section <old>=<new>[,<flags>] Rename section <old> to <new>\n\
0408dee6
DK
512 --long-section-names {enable|disable|keep}\n\
513 Handle long section names in Coff objects.\n\
d5bcb29d
NC
514 --change-leading-char Force output format's leading character style\n\
515 --remove-leading-char Remove leading character from global symbols\n\
9e48b4c6 516 --reverse-bytes=<num> Reverse <num> bytes at a time, in output sections with content\n\
57938635 517 --redefine-sym <old>=<new> Redefine symbol name <old> to <new>\n\
92991082
JT
518 --redefine-syms <file> --redefine-sym for all symbol pairs \n\
519 listed in <file>\n\
420496c1
NC
520 --srec-len <number> Restrict the length of generated Srecords\n\
521 --srec-forceS3 Restrict the type of generated Srecords to S3\n\
16b2b71c 522 --strip-symbols <file> -N for all symbols listed in <file>\n\
bcf32829
JB
523 --strip-unneeded-symbols <file>\n\
524 --strip-unneeded-symbol for all symbols listed\n\
525 in <file>\n\
16b2b71c
NC
526 --keep-symbols <file> -K for all symbols listed in <file>\n\
527 --localize-symbols <file> -L for all symbols listed in <file>\n\
7b4a0685 528 --globalize-symbols <file> --globalize-symbol for all in <file>\n\
16b2b71c
NC
529 --keep-global-symbols <file> -G for all symbols listed in <file>\n\
530 --weaken-symbols <file> -W for all symbols listed in <file>\n\
f9d4ad2a 531 --alt-machine-code <index> Use the target's <index>'th alternative machine\n\
4087920c
MR
532 --writable-text Mark the output text as writable\n\
533 --readonly-text Make the output text write protected\n\
534 --pure Mark the output file as demand paged\n\
535 --impure Mark the output file as impure\n\
d7fb0dd2
NC
536 --prefix-symbols <prefix> Add <prefix> to start of every symbol name\n\
537 --prefix-sections <prefix> Add <prefix> to start of every section name\n\
538 --prefix-alloc-sections <prefix>\n\
539 Add <prefix> to start of every allocatable\n\
540 section name\n\
92dd4511
L
541 --file-alignment <num> Set PE file alignment to <num>\n\
542 --heap <reserve>[,<commit>] Set PE reserve/commit heap to <reserve>/\n\
543 <commit>\n\
544 --image-base <address> Set PE image base to <address>\n\
545 --section-alignment <num> Set PE section alignment to <num>\n\
546 --stack <reserve>[,<commit>] Set PE reserve/commit stack to <reserve>/\n\
547 <commit>\n\
548 --subsystem <name>[:<version>]\n\
235f6e53 549 Set PE subsystem to <name> [& <version>]]\n\
d5bcb29d 550 -v --verbose List all object files modified\n\
07012eee 551 @<file> Read options from <file>\n\
d5bcb29d
NC
552 -V --version Display this program's version number\n\
553 -h --help Display this output\n\
7c29036b 554 --info List object formats & architectures supported\n\
d5bcb29d 555"));
252b5132 556 list_supported_targets (program_name, stream);
92f01d61 557 if (REPORT_BUGS_TO[0] && exit_status == 0)
8ad3436c 558 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132
RH
559 exit (exit_status);
560}
561
562static void
84e2f313 563strip_usage (FILE *stream, int exit_status)
252b5132 564{
8b53311e
NC
565 fprintf (stream, _("Usage: %s <option(s)> in-file(s)\n"), program_name);
566 fprintf (stream, _(" Removes symbols and sections from files\n"));
6364e0b4 567 fprintf (stream, _(" The options are:\n"));
252b5132 568 fprintf (stream, _("\
8b53311e
NC
569 -I --input-target=<bfdname> Assume input file is in format <bfdname>\n\
570 -O --output-target=<bfdname> Create an output file in format <bfdname>\n\
571 -F --target=<bfdname> Set both input and output format to <bfdname>\n\
d5bcb29d 572 -p --preserve-dates Copy modified/access timestamps to the output\n\
8b53311e 573 -R --remove-section=<name> Remove section <name> from the output\n\
d5bcb29d 574 -s --strip-all Remove all symbol and relocation information\n\
2593f09a 575 -g -S -d --strip-debug Remove all debugging symbols & sections\n\
d5bcb29d 576 --strip-unneeded Remove all symbols not needed by relocations\n\
6ea3dd37 577 --only-keep-debug Strip everything but the debug information\n\
8b53311e 578 -N --strip-symbol=<name> Do not copy symbol <name>\n\
5219e4c0 579 -K --keep-symbol=<name> Do not strip symbol <name>\n\
1637cd90 580 --keep-file-symbols Do not strip file symbol(s)\n\
a95b5cf9 581 -w --wildcard Permit wildcard in symbol comparison\n\
d5bcb29d
NC
582 -x --discard-all Remove all non-global symbols\n\
583 -X --discard-locals Remove any compiler-generated symbols\n\
584 -v --verbose List all object files modified\n\
585 -V --version Display this program's version number\n\
586 -h --help Display this output\n\
7c29036b 587 --info List object formats & architectures supported\n\
d5bcb29d
NC
588 -o <file> Place stripped output into <file>\n\
589"));
590
252b5132 591 list_supported_targets (program_name, stream);
92f01d61 592 if (REPORT_BUGS_TO[0] && exit_status == 0)
8ad3436c 593 fprintf (stream, _("Report bugs to %s\n"), REPORT_BUGS_TO);
252b5132
RH
594 exit (exit_status);
595}
596
597/* Parse section flags into a flagword, with a fatal error if the
598 string can't be parsed. */
599
600static flagword
84e2f313 601parse_flags (const char *s)
252b5132
RH
602{
603 flagword ret;
604 const char *snext;
605 int len;
606
607 ret = SEC_NO_FLAGS;
608
609 do
610 {
611 snext = strchr (s, ',');
612 if (snext == NULL)
613 len = strlen (s);
614 else
615 {
616 len = snext - s;
617 ++snext;
618 }
619
620 if (0) ;
621#define PARSE_FLAG(fname,fval) \
622 else if (strncasecmp (fname, s, len) == 0) ret |= fval
623 PARSE_FLAG ("alloc", SEC_ALLOC);
624 PARSE_FLAG ("load", SEC_LOAD);
3994e2c6 625 PARSE_FLAG ("noload", SEC_NEVER_LOAD);
252b5132 626 PARSE_FLAG ("readonly", SEC_READONLY);
3994e2c6 627 PARSE_FLAG ("debug", SEC_DEBUGGING);
252b5132
RH
628 PARSE_FLAG ("code", SEC_CODE);
629 PARSE_FLAG ("data", SEC_DATA);
630 PARSE_FLAG ("rom", SEC_ROM);
ebe372c1 631 PARSE_FLAG ("share", SEC_COFF_SHARED);
252b5132
RH
632 PARSE_FLAG ("contents", SEC_HAS_CONTENTS);
633#undef PARSE_FLAG
634 else
635 {
636 char *copy;
637
3f5e193b 638 copy = (char *) xmalloc (len + 1);
252b5132
RH
639 strncpy (copy, s, len);
640 copy[len] = '\0';
641 non_fatal (_("unrecognized section flag `%s'"), copy);
57938635
AM
642 fatal (_("supported flags: %s"),
643 "alloc, load, noload, readonly, debug, code, data, rom, share, contents");
252b5132
RH
644 }
645
646 s = snext;
647 }
648 while (s != NULL);
649
650 return ret;
651}
652
653/* Find and optionally add an entry in the change_sections list. */
654
655static struct section_list *
84e2f313 656find_section_list (const char *name, bfd_boolean add)
252b5132 657{
84e2f313 658 struct section_list *p;
252b5132
RH
659
660 for (p = change_sections; p != NULL; p = p->next)
661 if (strcmp (p->name, name) == 0)
662 return p;
663
664 if (! add)
665 return NULL;
666
3f5e193b 667 p = (struct section_list *) xmalloc (sizeof (struct section_list));
252b5132 668 p->name = name;
b34976b6
AM
669 p->used = FALSE;
670 p->remove = FALSE;
671 p->copy = FALSE;
252b5132
RH
672 p->change_vma = CHANGE_IGNORE;
673 p->change_lma = CHANGE_IGNORE;
674 p->vma_val = 0;
675 p->lma_val = 0;
b34976b6 676 p->set_flags = FALSE;
252b5132
RH
677 p->flags = 0;
678
679 p->next = change_sections;
680 change_sections = p;
681
682 return p;
683}
684
047c9024
NC
685/* There is htab_hash_string but no htab_eq_string. Makes sense. */
686
687static int
688eq_string (const void *s1, const void *s2)
689{
3f5e193b 690 return strcmp ((const char *) s1, (const char *) s2) == 0;
047c9024
NC
691}
692
693static htab_t
694create_symbol_htab (void)
695{
696 return htab_create_alloc (16, htab_hash_string, eq_string, NULL, xcalloc, free);
697}
252b5132 698
57938635 699static void
047c9024 700create_symbol_htabs (void)
252b5132 701{
047c9024
NC
702 strip_specific_htab = create_symbol_htab ();
703 strip_unneeded_htab = create_symbol_htab ();
704 keep_specific_htab = create_symbol_htab ();
705 localize_specific_htab = create_symbol_htab ();
706 globalize_specific_htab = create_symbol_htab ();
707 keepglobal_specific_htab = create_symbol_htab ();
708 weaken_specific_htab = create_symbol_htab ();
709}
710
711/* Add a symbol to strip_specific_list. */
252b5132 712
047c9024
NC
713static void
714add_specific_symbol (const char *name, htab_t htab)
715{
716 *htab_find_slot (htab, name, INSERT) = (char *) name;
252b5132
RH
717}
718
0af11b59 719/* Add symbols listed in `filename' to strip_specific_list. */
16b2b71c
NC
720
721#define IS_WHITESPACE(c) ((c) == ' ' || (c) == '\t')
722#define IS_LINE_TERMINATOR(c) ((c) == '\n' || (c) == '\r' || (c) == '\0')
723
724static void
047c9024 725add_specific_symbols (const char *filename, htab_t htab)
16b2b71c 726{
f24ddbdd 727 off_t size;
16b2b71c
NC
728 FILE * f;
729 char * line;
730 char * buffer;
731 unsigned int line_count;
0af11b59 732
f24ddbdd
NC
733 size = get_file_size (filename);
734 if (size == 0)
d68c385b
NC
735 {
736 status = 1;
737 return;
738 }
16b2b71c 739
3f5e193b 740 buffer = (char *) xmalloc (size + 2);
16b2b71c
NC
741 f = fopen (filename, FOPEN_RT);
742 if (f == NULL)
f24ddbdd 743 fatal (_("cannot open '%s': %s"), filename, strerror (errno));
16b2b71c 744
f24ddbdd 745 if (fread (buffer, 1, size, f) == 0 || ferror (f))
16b2b71c
NC
746 fatal (_("%s: fread failed"), filename);
747
748 fclose (f);
f24ddbdd
NC
749 buffer [size] = '\n';
750 buffer [size + 1] = '\0';
16b2b71c
NC
751
752 line_count = 1;
0af11b59 753
16b2b71c
NC
754 for (line = buffer; * line != '\0'; line ++)
755 {
756 char * eol;
757 char * name;
758 char * name_end;
b34976b6 759 int finished = FALSE;
16b2b71c
NC
760
761 for (eol = line;; eol ++)
762 {
763 switch (* eol)
764 {
765 case '\n':
766 * eol = '\0';
767 /* Cope with \n\r. */
768 if (eol[1] == '\r')
769 ++ eol;
b34976b6 770 finished = TRUE;
16b2b71c 771 break;
0af11b59 772
16b2b71c
NC
773 case '\r':
774 * eol = '\0';
775 /* Cope with \r\n. */
776 if (eol[1] == '\n')
777 ++ eol;
b34976b6 778 finished = TRUE;
16b2b71c 779 break;
0af11b59 780
16b2b71c 781 case 0:
b34976b6 782 finished = TRUE;
16b2b71c 783 break;
0af11b59 784
16b2b71c
NC
785 case '#':
786 /* Line comment, Terminate the line here, in case a
787 name is present and then allow the rest of the
788 loop to find the real end of the line. */
789 * eol = '\0';
790 break;
0af11b59 791
16b2b71c
NC
792 default:
793 break;
794 }
795
796 if (finished)
797 break;
798 }
799
800 /* A name may now exist somewhere between 'line' and 'eol'.
801 Strip off leading whitespace and trailing whitespace,
802 then add it to the list. */
803 for (name = line; IS_WHITESPACE (* name); name ++)
804 ;
805 for (name_end = name;
806 (! IS_WHITESPACE (* name_end))
807 && (! IS_LINE_TERMINATOR (* name_end));
0af11b59
KH
808 name_end ++)
809 ;
16b2b71c
NC
810
811 if (! IS_LINE_TERMINATOR (* name_end))
812 {
813 char * extra;
814
815 for (extra = name_end + 1; IS_WHITESPACE (* extra); extra ++)
816 ;
817
818 if (! IS_LINE_TERMINATOR (* extra))
d412a550
NC
819 non_fatal (_("%s:%d: Ignoring rubbish found on this line"),
820 filename, line_count);
16b2b71c 821 }
0af11b59 822
16b2b71c
NC
823 * name_end = '\0';
824
825 if (name_end > name)
047c9024 826 add_specific_symbol (name, htab);
16b2b71c
NC
827
828 /* Advance line pointer to end of line. The 'eol ++' in the for
829 loop above will then advance us to the start of the next line. */
830 line = eol;
831 line_count ++;
832 }
833}
834
047c9024
NC
835/* See whether a symbol should be stripped or kept
836 based on strip_specific_list and keep_symbols. */
252b5132 837
047c9024
NC
838static int
839is_specified_symbol_predicate (void **slot, void *data)
252b5132 840{
3f5e193b
NC
841 struct is_specified_symbol_predicate_data *d =
842 (struct is_specified_symbol_predicate_data *) data;
843 const char *slot_name = (char *) *slot;
252b5132 844
047c9024 845 if (*slot_name != '!')
5fe11841 846 {
047c9024
NC
847 if (! fnmatch (slot_name, d->name, 0))
848 {
849 d->found = TRUE;
850 /* Stop traversal. */
851 return 0;
852 }
5fe11841
NC
853 }
854 else
855 {
047c9024
NC
856 if (fnmatch (slot_name + 1, d->name, 0))
857 {
858 d->found = TRUE;
859 /* Stop traversal. */
860 return 0;
861 }
5fe11841 862 }
594ef5db 863
047c9024
NC
864 /* Continue traversal. */
865 return 1;
866}
867
868static bfd_boolean
869is_specified_symbol (const char *name, htab_t htab)
870{
871 if (wildcard)
872 {
873 struct is_specified_symbol_predicate_data data;
874
875 data.name = name;
876 data.found = FALSE;
877
878 htab_traverse (htab, is_specified_symbol_predicate, &data);
879
880 return data.found;
881 }
882
883 return htab_find (htab, name) != NULL;
252b5132
RH
884}
885
30288845
AM
886/* Return a pointer to the symbol used as a signature for GROUP. */
887
888static asymbol *
889group_signature (asection *group)
890{
891 bfd *abfd = group->owner;
892 Elf_Internal_Shdr *ghdr;
893
894 if (bfd_get_flavour (abfd) != bfd_target_elf_flavour)
895 return NULL;
896
897 ghdr = &elf_section_data (group)->this_hdr;
898 if (ghdr->sh_link < elf_numsections (abfd))
899 {
900 const struct elf_backend_data *bed = get_elf_backend_data (abfd);
901 Elf_Internal_Shdr *symhdr = elf_elfsections (abfd) [ghdr->sh_link];
902
903 if (symhdr->sh_type == SHT_SYMTAB
904 && ghdr->sh_info < symhdr->sh_size / bed->s->sizeof_sym)
748fc5e9 905 return isympp[ghdr->sh_info - 1];
30288845
AM
906 }
907 return NULL;
908}
909
252b5132
RH
910/* See if a section is being removed. */
911
b34976b6 912static bfd_boolean
84e2f313 913is_strip_section (bfd *abfd ATTRIBUTE_UNUSED, asection *sec)
252b5132 914{
2593f09a
NC
915 if (sections_removed || sections_copied)
916 {
917 struct section_list *p;
918
919 p = find_section_list (bfd_get_section_name (abfd, sec), FALSE);
920
921 if (sections_removed && p != NULL && p->remove)
922 return TRUE;
923 if (sections_copied && (p == NULL || ! p->copy))
924 return TRUE;
925 }
252b5132 926
2593f09a
NC
927 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0)
928 {
929 if (strip_symbols == STRIP_DEBUG
252b5132
RH
930 || strip_symbols == STRIP_UNNEEDED
931 || strip_symbols == STRIP_ALL
932 || discard_locals == LOCALS_ALL
2593f09a
NC
933 || convert_debugging)
934 return TRUE;
ed1653a7
NC
935
936 if (strip_symbols == STRIP_NONDEBUG)
937 return FALSE;
2593f09a 938 }
f91ea849 939
30288845
AM
940 if ((bfd_get_section_flags (abfd, sec) & SEC_GROUP) != 0)
941 {
942 asymbol *gsym;
943 const char *gname;
944
30288845
AM
945 /* PR binutils/3181
946 If we are going to strip the group signature symbol, then
947 strip the group section too. */
948 gsym = group_signature (sec);
949 if (gsym != NULL)
950 gname = gsym->name;
951 else
952 gname = sec->name;
953 if ((strip_symbols == STRIP_ALL
047c9024
NC
954 && !is_specified_symbol (gname, keep_specific_htab))
955 || is_specified_symbol (gname, strip_specific_htab))
30288845
AM
956 return TRUE;
957 }
91bb255c 958
f0312d39 959 return FALSE;
252b5132
RH
960}
961
d58c2e3a
RS
962/* Return true if SYM is a hidden symbol. */
963
964static bfd_boolean
965is_hidden_symbol (asymbol *sym)
966{
967 elf_symbol_type *elf_sym;
968
969 elf_sym = elf_symbol_from (sym->the_bfd, sym);
970 if (elf_sym != NULL)
971 switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
972 {
973 case STV_HIDDEN:
974 case STV_INTERNAL:
975 return TRUE;
976 }
977 return FALSE;
978}
979
252b5132
RH
980/* Choose which symbol entries to copy; put the result in OSYMS.
981 We don't copy in place, because that confuses the relocs.
982 Return the number of symbols to print. */
983
984static unsigned int
84e2f313
NC
985filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
986 asymbol **isyms, long symcount)
252b5132 987{
84e2f313 988 asymbol **from = isyms, **to = osyms;
252b5132 989 long src_count = 0, dst_count = 0;
e205a099 990 int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
252b5132
RH
991
992 for (; src_count < symcount; src_count++)
993 {
994 asymbol *sym = from[src_count];
995 flagword flags = sym->flags;
d7fb0dd2 996 char *name = (char *) bfd_asymbol_name (sym);
312aaa3c
NC
997 bfd_boolean keep;
998 bfd_boolean used_in_reloc = FALSE;
b34976b6 999 bfd_boolean undefined;
d7fb0dd2
NC
1000 bfd_boolean rem_leading_char;
1001 bfd_boolean add_leading_char;
1002
1003 undefined = bfd_is_und_section (bfd_get_section (sym));
252b5132 1004
57938635
AM
1005 if (redefine_sym_list)
1006 {
d7fb0dd2 1007 char *old_name, *new_name;
57938635 1008
d7fb0dd2
NC
1009 old_name = (char *) bfd_asymbol_name (sym);
1010 new_name = (char *) lookup_sym_redefinition (old_name);
66491ebc
AM
1011 bfd_asymbol_name (sym) = new_name;
1012 name = new_name;
57938635
AM
1013 }
1014
d7fb0dd2
NC
1015 /* Check if we will remove the current leading character. */
1016 rem_leading_char =
1017 (name[0] == bfd_get_symbol_leading_char (abfd))
1018 && (change_leading_char
1019 || (remove_leading_char
1020 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1021 || undefined
1022 || bfd_is_com_section (bfd_get_section (sym)))));
1023
1024 /* Check if we will add a new leading character. */
1025 add_leading_char =
1026 change_leading_char
1027 && (bfd_get_symbol_leading_char (obfd) != '\0')
1028 && (bfd_get_symbol_leading_char (abfd) == '\0'
1029 || (name[0] == bfd_get_symbol_leading_char (abfd)));
1030
1031 /* Short circuit for change_leading_char if we can do it in-place. */
1032 if (rem_leading_char && add_leading_char && !prefix_symbols_string)
1033 {
1034 name[0] = bfd_get_symbol_leading_char (obfd);
1035 bfd_asymbol_name (sym) = name;
1036 rem_leading_char = FALSE;
1037 add_leading_char = FALSE;
1038 }
1039
1040 /* Remove leading char. */
1041 if (rem_leading_char)
66491ebc 1042 bfd_asymbol_name (sym) = ++name;
d7fb0dd2
NC
1043
1044 /* Add new leading char and/or prefix. */
1045 if (add_leading_char || prefix_symbols_string)
1046 {
1047 char *n, *ptr;
1048
3f5e193b
NC
1049 ptr = n = (char *) xmalloc (1 + strlen (prefix_symbols_string)
1050 + strlen (name) + 1);
d7fb0dd2
NC
1051 if (add_leading_char)
1052 *ptr++ = bfd_get_symbol_leading_char (obfd);
1053
1054 if (prefix_symbols_string)
1055 {
1056 strcpy (ptr, prefix_symbols_string);
1057 ptr += strlen (prefix_symbols_string);
1058 }
1059
1060 strcpy (ptr, name);
66491ebc
AM
1061 bfd_asymbol_name (sym) = n;
1062 name = n;
252b5132
RH
1063 }
1064
252b5132 1065 if (strip_symbols == STRIP_ALL)
312aaa3c 1066 keep = FALSE;
252b5132
RH
1067 else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */
1068 || ((flags & BSF_SECTION_SYM) != 0
1069 && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
1070 & BSF_KEEP) != 0))
312aaa3c
NC
1071 {
1072 keep = TRUE;
1073 used_in_reloc = TRUE;
1074 }
0af11b59 1075 else if (relocatable /* Relocatable file. */
0691f7af
L
1076 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1077 || bfd_is_com_section (bfd_get_section (sym))))
312aaa3c 1078 keep = TRUE;
16b2b71c
NC
1079 else if (bfd_decode_symclass (sym) == 'I')
1080 /* Global symbols in $idata sections need to be retained
b34976b6 1081 even if relocatable is FALSE. External users of the
16b2b71c
NC
1082 library containing the $idata section may reference these
1083 symbols. */
312aaa3c 1084 keep = TRUE;
252b5132
RH
1085 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
1086 || (flags & BSF_WEAK) != 0
24e01a36 1087 || undefined
252b5132
RH
1088 || bfd_is_com_section (bfd_get_section (sym)))
1089 keep = strip_symbols != STRIP_UNNEEDED;
1090 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
1091 keep = (strip_symbols != STRIP_DEBUG
1092 && strip_symbols != STRIP_UNNEEDED
1093 && ! convert_debugging);
082b7297 1094 else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
af3bdff7
NC
1095 /* COMDAT sections store special information in local
1096 symbols, so we cannot risk stripping any of them. */
312aaa3c 1097 keep = TRUE;
252b5132
RH
1098 else /* Local symbol. */
1099 keep = (strip_symbols != STRIP_UNNEEDED
1100 && (discard_locals != LOCALS_ALL
1101 && (discard_locals != LOCALS_START_L
1102 || ! bfd_is_local_label (abfd, sym))));
1103
047c9024 1104 if (keep && is_specified_symbol (name, strip_specific_htab))
312aaa3c
NC
1105 {
1106 /* There are multiple ways to set 'keep' above, but if it
1107 was the relocatable symbol case, then that's an error. */
1108 if (used_in_reloc)
1109 {
1110 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
1111 status = 1;
1112 }
1113 else
1114 keep = FALSE;
1115 }
1116
bcf32829
JB
1117 if (keep
1118 && !(flags & BSF_KEEP)
047c9024 1119 && is_specified_symbol (name, strip_unneeded_htab))
312aaa3c
NC
1120 keep = FALSE;
1121
1637cd90
JB
1122 if (!keep
1123 && ((keep_file_symbols && (flags & BSF_FILE))
047c9024 1124 || is_specified_symbol (name, keep_specific_htab)))
312aaa3c
NC
1125 keep = TRUE;
1126
252b5132 1127 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
312aaa3c 1128 keep = FALSE;
e0c60db2 1129
7b4a0685 1130 if (keep)
252b5132 1131 {
7b4a0685 1132 if ((flags & BSF_GLOBAL) != 0
047c9024 1133 && (weaken || is_specified_symbol (name, weaken_specific_htab)))
7b4a0685
NC
1134 {
1135 sym->flags &= ~ BSF_GLOBAL;
1136 sym->flags |= BSF_WEAK;
1137 }
252b5132 1138
7b4a0685
NC
1139 if (!undefined
1140 && (flags & (BSF_GLOBAL | BSF_WEAK))
047c9024
NC
1141 && (is_specified_symbol (name, localize_specific_htab)
1142 || (htab_elements (keepglobal_specific_htab) != 0
1143 && ! is_specified_symbol (name, keepglobal_specific_htab))
d58c2e3a 1144 || (localize_hidden && is_hidden_symbol (sym))))
7b4a0685
NC
1145 {
1146 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1147 sym->flags |= BSF_LOCAL;
1148 }
1149
1150 if (!undefined
c1c0eb9e 1151 && (flags & BSF_LOCAL)
047c9024 1152 && is_specified_symbol (name, globalize_specific_htab))
7b4a0685
NC
1153 {
1154 sym->flags &= ~ BSF_LOCAL;
1155 sym->flags |= BSF_GLOBAL;
1156 }
1157
1158 to[dst_count++] = sym;
1159 }
252b5132
RH
1160 }
1161
1162 to[dst_count] = NULL;
1163
1164 return dst_count;
1165}
1166
594ef5db
NC
1167/* Find the redefined name of symbol SOURCE. */
1168
57938635 1169static const char *
84e2f313 1170lookup_sym_redefinition (const char *source)
57938635 1171{
57938635
AM
1172 struct redefine_node *list;
1173
57938635 1174 for (list = redefine_sym_list; list != NULL; list = list->next)
594ef5db
NC
1175 if (strcmp (source, list->source) == 0)
1176 return list->target;
1177
1178 return source;
57938635
AM
1179}
1180
594ef5db 1181/* Add a node to a symbol redefine list. */
57938635
AM
1182
1183static void
84e2f313 1184redefine_list_append (const char *cause, const char *source, const char *target)
57938635
AM
1185{
1186 struct redefine_node **p;
1187 struct redefine_node *list;
1188 struct redefine_node *new_node;
1189
1190 for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1191 {
1192 if (strcmp (source, list->source) == 0)
594ef5db 1193 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
92991082 1194 cause, source);
57938635
AM
1195
1196 if (strcmp (target, list->target) == 0)
594ef5db 1197 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
92991082 1198 cause, target);
57938635
AM
1199 }
1200
3f5e193b 1201 new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
57938635
AM
1202
1203 new_node->source = strdup (source);
1204 new_node->target = strdup (target);
1205 new_node->next = NULL;
1206
1207 *p = new_node;
1208}
1209
92991082
JT
1210/* Handle the --redefine-syms option. Read lines containing "old new"
1211 from the file, and add them to the symbol redefine list. */
1212
2593f09a 1213static void
84e2f313 1214add_redefine_syms_file (const char *filename)
92991082
JT
1215{
1216 FILE *file;
1217 char *buf;
84e2f313
NC
1218 size_t bufsize;
1219 size_t len;
1220 size_t outsym_off;
92991082
JT
1221 int c, lineno;
1222
1223 file = fopen (filename, "r");
d3ba0551 1224 if (file == NULL)
92991082
JT
1225 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1226 filename, strerror (errno));
1227
1228 bufsize = 100;
a6da20b5 1229 buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */);
92991082
JT
1230
1231 lineno = 1;
1232 c = getc (file);
1233 len = 0;
1234 outsym_off = 0;
1235 while (c != EOF)
1236 {
1237 /* Collect the input symbol name. */
1238 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1239 {
1240 if (c == '#')
1241 goto comment;
1242 buf[len++] = c;
1243 if (len >= bufsize)
1244 {
1245 bufsize *= 2;
a6da20b5 1246 buf = (char *) xrealloc (buf, bufsize + 1);
92991082
JT
1247 }
1248 c = getc (file);
1249 }
1250 buf[len++] = '\0';
1251 if (c == EOF)
1252 break;
1253
1254 /* Eat white space between the symbol names. */
1255 while (IS_WHITESPACE (c))
1256 c = getc (file);
1257 if (c == '#' || IS_LINE_TERMINATOR (c))
1258 goto comment;
1259 if (c == EOF)
1260 break;
1261
1262 /* Collect the output symbol name. */
1263 outsym_off = len;
1264 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1265 {
1266 if (c == '#')
1267 goto comment;
1268 buf[len++] = c;
1269 if (len >= bufsize)
1270 {
1271 bufsize *= 2;
a6da20b5 1272 buf = (char *) xrealloc (buf, bufsize + 1);
92991082
JT
1273 }
1274 c = getc (file);
1275 }
1276 buf[len++] = '\0';
1277 if (c == EOF)
1278 break;
1279
1280 /* Eat white space at end of line. */
1281 while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1282 c = getc (file);
1283 if (c == '#')
1284 goto comment;
1285 /* Handle \r\n. */
1286 if ((c == '\r' && (c = getc (file)) == '\n')
1287 || c == '\n' || c == EOF)
1288 {
1289 end_of_line:
1290 /* Append the redefinition to the list. */
1291 if (buf[0] != '\0')
1292 redefine_list_append (filename, &buf[0], &buf[outsym_off]);
1293
c1c0eb9e 1294 lineno++;
92991082
JT
1295 len = 0;
1296 outsym_off = 0;
1297 if (c == EOF)
1298 break;
1299 c = getc (file);
1300 continue;
1301 }
1302 else
d412a550 1303 fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
92991082
JT
1304 comment:
1305 if (len != 0 && (outsym_off == 0 || outsym_off == len))
d412a550 1306 fatal (_("%s:%d: missing new symbol name"), filename, lineno);
92991082
JT
1307 buf[len++] = '\0';
1308
1309 /* Eat the rest of the line and finish it. */
1310 while (c != '\n' && c != EOF)
1311 c = getc (file);
1312 goto end_of_line;
1313 }
1314
1315 if (len != 0)
d412a550 1316 fatal (_("%s:%d: premature end of file"), filename, lineno);
92991082
JT
1317
1318 free (buf);
1319}
1320
77f762d6
L
1321/* Copy unkown object file IBFD onto OBFD.
1322 Returns TRUE upon success, FALSE otherwise. */
1323
1324static bfd_boolean
1325copy_unknown_object (bfd *ibfd, bfd *obfd)
1326{
1327 char *cbuf;
1328 int tocopy;
1329 long ncopied;
1330 long size;
1331 struct stat buf;
1332
1333 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1334 {
8d8e0703 1335 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
77f762d6
L
1336 return FALSE;
1337 }
1338
1339 size = buf.st_size;
1340 if (size < 0)
1341 {
1342 non_fatal (_("stat returns negative size for `%s'"),
1343 bfd_get_archive_filename (ibfd));
1344 return FALSE;
1345 }
1346
1347 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1348 {
1349 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1350 return FALSE;
1351 }
1352
1353 if (verbose)
1354 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1355 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1356
3f5e193b 1357 cbuf = (char *) xmalloc (BUFSIZE);
77f762d6
L
1358 ncopied = 0;
1359 while (ncopied < size)
1360 {
1361 tocopy = size - ncopied;
1362 if (tocopy > BUFSIZE)
1363 tocopy = BUFSIZE;
1364
1365 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1366 != (bfd_size_type) tocopy)
1367 {
8d8e0703 1368 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
77f762d6
L
1369 free (cbuf);
1370 return FALSE;
1371 }
1372
1373 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1374 != (bfd_size_type) tocopy)
1375 {
2db6cde7 1376 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
77f762d6
L
1377 free (cbuf);
1378 return FALSE;
1379 }
1380
1381 ncopied += tocopy;
1382 }
1383
1384 chmod (bfd_get_filename (obfd), buf.st_mode);
1385 free (cbuf);
1386 return TRUE;
1387}
1388
950d48e7 1389/* Copy object file IBFD onto OBFD.
5b8c74e6 1390 Returns TRUE upon success, FALSE otherwise. */
252b5132 1391
950d48e7 1392static bfd_boolean
8b31b6c4 1393copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
252b5132
RH
1394{
1395 bfd_vma start;
1396 long symcount;
1397 asection **osections = NULL;
84e2f313 1398 asection *gnu_debuglink_section = NULL;
252b5132
RH
1399 bfd_size_type *gaps = NULL;
1400 bfd_size_type max_gap = 0;
1401 long symsize;
84e2f313 1402 void *dhandle;
66491ebc
AM
1403 enum bfd_architecture iarch;
1404 unsigned int imach;
252b5132 1405
23719f39
NC
1406 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1407 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
1408 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
950d48e7 1409 fatal (_("Unable to change endianness of input file(s)"));
252b5132
RH
1410
1411 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
950d48e7 1412 {
2db6cde7 1413 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
950d48e7
NC
1414 return FALSE;
1415 }
252b5132
RH
1416
1417 if (verbose)
77f762d6
L
1418 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1419 bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
252b5132
RH
1420 bfd_get_filename (obfd), bfd_get_target (obfd));
1421
d3e52d40
RS
1422 if (extract_symbol)
1423 start = 0;
252b5132 1424 else
d3e52d40
RS
1425 {
1426 if (set_start_set)
1427 start = set_start;
1428 else
1429 start = bfd_get_start_address (ibfd);
1430 start += change_start;
1431 }
252b5132 1432
0af11b59
KH
1433 /* Neither the start address nor the flags
1434 need to be set for a core file. */
4dd67f29
MS
1435 if (bfd_get_format (obfd) != bfd_core)
1436 {
4087920c
MR
1437 flagword flags;
1438
1439 flags = bfd_get_file_flags (ibfd);
1440 flags |= bfd_flags_to_set;
1441 flags &= ~bfd_flags_to_clear;
1442 flags &= bfd_applicable_file_flags (obfd);
1443
3516e984
L
1444 if (strip_symbols == STRIP_ALL)
1445 flags &= ~HAS_RELOC;
1446
4dd67f29 1447 if (!bfd_set_start_address (obfd, start)
4087920c 1448 || !bfd_set_file_flags (obfd, flags))
950d48e7 1449 {
8d8e0703 1450 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
950d48e7
NC
1451 return FALSE;
1452 }
4dd67f29 1453 }
252b5132 1454
594ef5db 1455 /* Copy architecture of input file to output file. */
66491ebc
AM
1456 iarch = bfd_get_arch (ibfd);
1457 imach = bfd_get_mach (ibfd);
8b31b6c4
NC
1458 if (input_arch)
1459 {
1460 if (bfd_get_arch_info (ibfd) == NULL
1461 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
1462 {
1463 iarch = input_arch->arch;
1464 imach = input_arch->mach;
1465 }
1466 else
1467 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
1468 bfd_get_archive_filename (ibfd));
1469 }
66491ebc 1470 if (!bfd_set_arch_mach (obfd, iarch, imach)
212a3c4d
L
1471 && (ibfd->target_defaulted
1472 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
f57a841a
NC
1473 {
1474 if (bfd_get_arch (ibfd) == bfd_arch_unknown)
77f762d6
L
1475 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1476 bfd_get_archive_filename (ibfd));
f57a841a 1477 else
c1e2cb9d 1478 non_fatal (_("Output file cannot represent architecture `%s'"),
77f762d6
L
1479 bfd_printable_arch_mach (bfd_get_arch (ibfd),
1480 bfd_get_mach (ibfd)));
1481 return FALSE;
f57a841a 1482 }
57938635 1483
252b5132 1484 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
950d48e7 1485 {
8d8e0703 1486 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
950d48e7
NC
1487 return FALSE;
1488 }
252b5132 1489
92dd4511
L
1490 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
1491 && bfd_pei_p (obfd))
1492 {
1493 /* Set up PE parameters. */
1494 pe_data_type *pe = pe_data (obfd);
1495
325c681d
L
1496 /* Copy PE parameters before changing them. */
1497 if (ibfd->xvec->flavour == bfd_target_coff_flavour
1498 && bfd_pei_p (ibfd))
1499 pe->pe_opthdr = pe_data (ibfd)->pe_opthdr;
1500
92dd4511
L
1501 if (pe_file_alignment != (bfd_vma) -1)
1502 pe->pe_opthdr.FileAlignment = pe_file_alignment;
1503 else
1504 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
1505
1506 if (pe_heap_commit != (bfd_vma) -1)
1507 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
1508
1509 if (pe_heap_reserve != (bfd_vma) -1)
1510 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
1511
1512 if (pe_image_base != (bfd_vma) -1)
1513 pe->pe_opthdr.ImageBase = pe_image_base;
1514
1515 if (pe_section_alignment != (bfd_vma) -1)
1516 pe->pe_opthdr.SectionAlignment = pe_section_alignment;
1517 else
1518 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
1519
1520 if (pe_stack_commit != (bfd_vma) -1)
1521 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
1522
1523 if (pe_stack_reserve != (bfd_vma) -1)
1524 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
1525
1526 if (pe_subsystem != -1)
1527 pe->pe_opthdr.Subsystem = pe_subsystem;
1528
1529 if (pe_major_subsystem_version != -1)
1530 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
1531
1532 if (pe_minor_subsystem_version != -1)
1533 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
1534
1535 if (pe_file_alignment > pe_section_alignment)
1536 {
1537 char file_alignment[20], section_alignment[20];
1538
1539 sprintf_vma (file_alignment, pe_file_alignment);
1540 sprintf_vma (section_alignment, pe_section_alignment);
1541 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
1542
1543 file_alignment, section_alignment);
1544 }
1545 }
1546
252b5132 1547 if (isympp)
62d732f5 1548 free (isympp);
57938635 1549
252b5132 1550 if (osympp != isympp)
62d732f5
AM
1551 free (osympp);
1552
1553 isympp = NULL;
1554 osympp = NULL;
252b5132 1555
c39ada54
AM
1556 symsize = bfd_get_symtab_upper_bound (ibfd);
1557 if (symsize < 0)
1558 {
8d8e0703 1559 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
c39ada54
AM
1560 return FALSE;
1561 }
1562
3f5e193b 1563 osympp = isympp = (asymbol **) xmalloc (symsize);
c39ada54
AM
1564 symcount = bfd_canonicalize_symtab (ibfd, isympp);
1565 if (symcount < 0)
1566 {
2db6cde7 1567 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
c39ada54
AM
1568 return FALSE;
1569 }
1570
252b5132
RH
1571 /* BFD mandates that all output sections be created and sizes set before
1572 any output is done. Thus, we traverse all sections multiple times. */
d3ba0551 1573 bfd_map_over_sections (ibfd, setup_section, obfd);
252b5132 1574
237dcb53
AM
1575 if (!extract_symbol)
1576 setup_bfd_headers (ibfd, obfd);
80fccad2 1577
252b5132
RH
1578 if (add_sections != NULL)
1579 {
1580 struct section_add *padd;
1581 struct section_list *pset;
1582
1583 for (padd = add_sections; padd != NULL; padd = padd->next)
1584 {
2593f09a
NC
1585 flagword flags;
1586
551b43fd
AM
1587 pset = find_section_list (padd->name, FALSE);
1588 if (pset != NULL)
1589 pset->used = TRUE;
1590
1591 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
1592 if (pset != NULL && pset->set_flags)
1593 flags = pset->flags | SEC_HAS_CONTENTS;
1594
c8782eee
NC
1595 /* bfd_make_section_with_flags() does not return very helpful
1596 error codes, so check for the most likely user error first. */
1597 if (bfd_get_section_by_name (obfd, padd->name))
252b5132 1598 {
2db6cde7
NS
1599 bfd_nonfatal_message (NULL, obfd, NULL,
1600 _("can't add section '%s'"), padd->name);
950d48e7 1601 return FALSE;
252b5132 1602 }
c8782eee
NC
1603 else
1604 {
0930eddd
NS
1605 /* We use LINKER_CREATED here so that the backend hooks
1606 will create any special section type information,
1607 instead of presuming we know what we're doing merely
1608 because we set the flags. */
1609 padd->section = bfd_make_section_with_flags
1610 (obfd, padd->name, flags | SEC_LINKER_CREATED);
c8782eee
NC
1611 if (padd->section == NULL)
1612 {
2db6cde7
NS
1613 bfd_nonfatal_message (NULL, obfd, NULL,
1614 _("can't create section `%s'"),
1615 padd->name);
c8782eee
NC
1616 return FALSE;
1617 }
1618 }
252b5132 1619
2593f09a 1620 if (! bfd_set_section_size (obfd, padd->section, padd->size))
950d48e7 1621 {
2db6cde7 1622 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
950d48e7
NC
1623 return FALSE;
1624 }
252b5132 1625
2593f09a
NC
1626 if (pset != NULL)
1627 {
1628 if (pset->change_vma != CHANGE_IGNORE)
84e2f313
NC
1629 if (! bfd_set_section_vma (obfd, padd->section,
1630 pset->vma_val))
950d48e7 1631 {
2db6cde7 1632 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
950d48e7
NC
1633 return FALSE;
1634 }
57938635 1635
2593f09a
NC
1636 if (pset->change_lma != CHANGE_IGNORE)
1637 {
1638 padd->section->lma = pset->lma_val;
950d48e7 1639
2593f09a
NC
1640 if (! bfd_set_section_alignment
1641 (obfd, padd->section,
1642 bfd_section_alignment (obfd, padd->section)))
950d48e7 1643 {
2db6cde7 1644 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
950d48e7
NC
1645 return FALSE;
1646 }
252b5132
RH
1647 }
1648 }
1649 }
1650 }
1651
2593f09a
NC
1652 if (gnu_debuglink_filename != NULL)
1653 {
84e2f313
NC
1654 gnu_debuglink_section = bfd_create_gnu_debuglink_section
1655 (obfd, gnu_debuglink_filename);
e7c81c25
NC
1656
1657 if (gnu_debuglink_section == NULL)
950d48e7 1658 {
2db6cde7
NS
1659 bfd_nonfatal_message (NULL, obfd, NULL,
1660 _("cannot create debug link section `%s'"),
1661 gnu_debuglink_filename);
950d48e7
NC
1662 return FALSE;
1663 }
6e2c86ac
NC
1664
1665 /* Special processing for PE format files. We
1666 have no way to distinguish PE from COFF here. */
1667 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
1668 {
1669 bfd_vma debuglink_vma;
1670 asection * highest_section;
1671 asection * sec;
1672
1673 /* The PE spec requires that all sections be adjacent and sorted
1674 in ascending order of VMA. It also specifies that debug
1675 sections should be last. This is despite the fact that debug
1676 sections are not loaded into memory and so in theory have no
1677 use for a VMA.
1678
1679 This means that the debuglink section must be given a non-zero
1680 VMA which makes it contiguous with other debug sections. So
1681 walk the current section list, find the section with the
1682 highest VMA and start the debuglink section after that one. */
1683 for (sec = obfd->sections, highest_section = NULL;
1684 sec != NULL;
1685 sec = sec->next)
1686 if (sec->vma > 0
1687 && (highest_section == NULL
1688 || sec->vma > highest_section->vma))
1689 highest_section = sec;
1690
1691 if (highest_section)
1692 debuglink_vma = BFD_ALIGN (highest_section->vma
1693 + highest_section->size,
1694 /* FIXME: We ought to be using
1695 COFF_PAGE_SIZE here or maybe
1696 bfd_get_section_alignment() (if it
1697 was set) but since this is for PE
1698 and we know the required alignment
1699 it is easier just to hard code it. */
1700 0x1000);
1701 else
1702 /* Umm, not sure what to do in this case. */
1703 debuglink_vma = 0x1000;
1704
1705 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
1706 }
950d48e7
NC
1707 }
1708
1aa9ef63
L
1709 if (bfd_count_sections (obfd) != 0
1710 && (gap_fill_set || pad_to_set))
252b5132
RH
1711 {
1712 asection **set;
1713 unsigned int c, i;
1714
1715 /* We must fill in gaps between the sections and/or we must pad
1716 the last section to a specified address. We do this by
1717 grabbing a list of the sections, sorting them by VMA, and
1718 increasing the section sizes as required to fill the gaps.
1719 We write out the gap contents below. */
1720
1721 c = bfd_count_sections (obfd);
3f5e193b 1722 osections = (asection **) xmalloc (c * sizeof (asection *));
252b5132 1723 set = osections;
d3ba0551 1724 bfd_map_over_sections (obfd, get_sections, &set);
252b5132
RH
1725
1726 qsort (osections, c, sizeof (asection *), compare_section_lma);
1727
3f5e193b 1728 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
252b5132
RH
1729 memset (gaps, 0, c * sizeof (bfd_size_type));
1730
1731 if (gap_fill_set)
1732 {
1733 for (i = 0; i < c - 1; i++)
1734 {
1735 flagword flags;
1736 bfd_size_type size;
1737 bfd_vma gap_start, gap_stop;
1738
1739 flags = bfd_get_section_flags (obfd, osections[i]);
1740 if ((flags & SEC_HAS_CONTENTS) == 0
1741 || (flags & SEC_LOAD) == 0)
1742 continue;
1743
1744 size = bfd_section_size (obfd, osections[i]);
1745 gap_start = bfd_section_lma (obfd, osections[i]) + size;
1746 gap_stop = bfd_section_lma (obfd, osections[i + 1]);
1747 if (gap_start < gap_stop)
1748 {
1749 if (! bfd_set_section_size (obfd, osections[i],
1750 size + (gap_stop - gap_start)))
1751 {
2db6cde7
NS
1752 bfd_nonfatal_message (NULL, obfd, osections[i],
1753 _("Can't fill gap after section"));
252b5132
RH
1754 status = 1;
1755 break;
1756 }
1757 gaps[i] = gap_stop - gap_start;
1758 if (max_gap < gap_stop - gap_start)
1759 max_gap = gap_stop - gap_start;
1760 }
1761 }
1762 }
1763
1764 if (pad_to_set)
1765 {
1766 bfd_vma lma;
1767 bfd_size_type size;
1768
1769 lma = bfd_section_lma (obfd, osections[c - 1]);
1770 size = bfd_section_size (obfd, osections[c - 1]);
1771 if (lma + size < pad_to)
1772 {
1773 if (! bfd_set_section_size (obfd, osections[c - 1],
1774 pad_to - lma))
1775 {
2db6cde7
NS
1776 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
1777 _("can't add padding"));
252b5132
RH
1778 status = 1;
1779 }
1780 else
1781 {
1782 gaps[c - 1] = pad_to - (lma + size);
1783 if (max_gap < pad_to - (lma + size))
1784 max_gap = pad_to - (lma + size);
1785 }
1786 }
1787 }
1788 }
1789
594ef5db
NC
1790 /* Symbol filtering must happen after the output sections
1791 have been created, but before their contents are set. */
252b5132 1792 dhandle = NULL;
252b5132 1793 if (convert_debugging)
b922d590 1794 dhandle = read_debugging_info (ibfd, isympp, symcount, FALSE);
57938635
AM
1795
1796 if (strip_symbols == STRIP_DEBUG
252b5132
RH
1797 || strip_symbols == STRIP_ALL
1798 || strip_symbols == STRIP_UNNEEDED
ed1653a7 1799 || strip_symbols == STRIP_NONDEBUG
252b5132 1800 || discard_locals != LOCALS_UNDEF
d58c2e3a 1801 || localize_hidden
047c9024
NC
1802 || htab_elements (strip_specific_htab) != 0
1803 || htab_elements (keep_specific_htab) != 0
1804 || htab_elements (localize_specific_htab) != 0
1805 || htab_elements (globalize_specific_htab) != 0
1806 || htab_elements (keepglobal_specific_htab) != 0
1807 || htab_elements (weaken_specific_htab) != 0
d7fb0dd2 1808 || prefix_symbols_string
252b5132 1809 || sections_removed
f91ea849 1810 || sections_copied
252b5132
RH
1811 || convert_debugging
1812 || change_leading_char
1813 || remove_leading_char
57938635 1814 || redefine_sym_list
252b5132
RH
1815 || weaken)
1816 {
1817 /* Mark symbols used in output relocations so that they
1818 are kept, even if they are local labels or static symbols.
57938635 1819
252b5132
RH
1820 Note we iterate over the input sections examining their
1821 relocations since the relocations for the output sections
1822 haven't been set yet. mark_symbols_used_in_relocations will
1823 ignore input sections which have no corresponding output
1824 section. */
1825 if (strip_symbols != STRIP_ALL)
1826 bfd_map_over_sections (ibfd,
1827 mark_symbols_used_in_relocations,
d3ba0551 1828 isympp);
3f5e193b 1829 osympp = (asymbol **) xmalloc ((symcount + 1) * sizeof (asymbol *));
252b5132
RH
1830 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
1831 }
1832
1833 if (convert_debugging && dhandle != NULL)
1834 {
1835 if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
1836 {
1837 status = 1;
950d48e7 1838 return FALSE;
252b5132
RH
1839 }
1840 }
1841
1842 bfd_set_symtab (obfd, osympp, symcount);
1843
1844 /* This has to happen after the symbol table has been set. */
d3ba0551 1845 bfd_map_over_sections (ibfd, copy_section, obfd);
252b5132
RH
1846
1847 if (add_sections != NULL)
1848 {
1849 struct section_add *padd;
1850
1851 for (padd = add_sections; padd != NULL; padd = padd->next)
1852 {
d3ba0551
AM
1853 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
1854 0, padd->size))
950d48e7 1855 {
2db6cde7 1856 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
950d48e7
NC
1857 return FALSE;
1858 }
252b5132
RH
1859 }
1860 }
1861
e7c81c25
NC
1862 if (gnu_debuglink_filename != NULL)
1863 {
1864 if (! bfd_fill_in_gnu_debuglink_section
1865 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
950d48e7 1866 {
2db6cde7
NS
1867 bfd_nonfatal_message (NULL, obfd, NULL,
1868 _("cannot fill debug link section `%s'"),
1869 gnu_debuglink_filename);
950d48e7
NC
1870 return FALSE;
1871 }
e7c81c25
NC
1872 }
1873
252b5132
RH
1874 if (gap_fill_set || pad_to_set)
1875 {
1876 bfd_byte *buf;
1877 int c, i;
1878
1879 /* Fill in the gaps. */
252b5132
RH
1880 if (max_gap > 8192)
1881 max_gap = 8192;
3f5e193b 1882 buf = (bfd_byte *) xmalloc (max_gap);
d3ba0551 1883 memset (buf, gap_fill, max_gap);
252b5132
RH
1884
1885 c = bfd_count_sections (obfd);
1886 for (i = 0; i < c; i++)
1887 {
1888 if (gaps[i] != 0)
1889 {
1890 bfd_size_type left;
1891 file_ptr off;
1892
1893 left = gaps[i];
1894 off = bfd_section_size (obfd, osections[i]) - left;
594ef5db 1895
252b5132
RH
1896 while (left > 0)
1897 {
1898 bfd_size_type now;
1899
1900 if (left > 8192)
1901 now = 8192;
1902 else
1903 now = left;
1904
1905 if (! bfd_set_section_contents (obfd, osections[i], buf,
1906 off, now))
950d48e7 1907 {
2db6cde7 1908 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
950d48e7
NC
1909 return FALSE;
1910 }
252b5132
RH
1911
1912 left -= now;
1913 off += now;
1914 }
1915 }
1916 }
1917 }
1918
d3e52d40
RS
1919 /* Do not copy backend data if --extract-symbol is passed; anything
1920 that needs to look at the section contents will fail. */
1921 if (extract_symbol)
1922 return TRUE;
1923
252b5132
RH
1924 /* Allow the BFD backend to copy any private data it understands
1925 from the input BFD to the output BFD. This is done last to
1926 permit the routine to look at the filtered symbol table, which is
1927 important for the ECOFF code at least. */
42bb2e33 1928 if (! bfd_copy_private_bfd_data (ibfd, obfd))
252b5132 1929 {
2db6cde7
NS
1930 bfd_nonfatal_message (NULL, obfd, NULL,
1931 _("error copying private BFD data"));
950d48e7 1932 return FALSE;
252b5132 1933 }
1ae8b3d2
AO
1934
1935 /* Switch to the alternate machine code. We have to do this at the
1936 very end, because we only initialize the header when we create
1937 the first section. */
f9d4ad2a
NC
1938 if (use_alt_mach_code != 0)
1939 {
1940 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
1941 {
1942 non_fatal (_("this target does not support %lu alternative machine codes"),
1943 use_alt_mach_code);
1944 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
1945 {
1946 non_fatal (_("treating that number as an absolute e_machine value instead"));
1947 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
1948 }
1949 else
1950 non_fatal (_("ignoring the alternative value"));
1951 }
1952 }
950d48e7
NC
1953
1954 return TRUE;
252b5132
RH
1955}
1956
1957/* Read each archive element in turn from IBFD, copy the
ee873e00
NC
1958 contents to temp file, and keep the temp file handle.
1959 If 'force_output_target' is TRUE then make sure that
1960 all elements in the new archive are of the type
1961 'output_target'. */
252b5132
RH
1962
1963static void
ee873e00 1964copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
8b31b6c4
NC
1965 bfd_boolean force_output_target,
1966 const bfd_arch_info_type *input_arch)
252b5132
RH
1967{
1968 struct name_list
1969 {
1970 struct name_list *next;
4c168fa3 1971 const char *name;
252b5132
RH
1972 bfd *obfd;
1973 } *list, *l;
1974 bfd **ptr = &obfd->archive_head;
1975 bfd *this_element;
8d8e0703
AM
1976 char *dir;
1977 const char *filename;
252b5132
RH
1978
1979 /* Make a temp directory to hold the contents. */
f9c026a8 1980 dir = make_tempdir (bfd_get_filename (obfd));
f9c026a8
NC
1981 if (dir == NULL)
1982 fatal (_("cannot create tempdir for archive copying (error: %s)"),
1983 strerror (errno));
84e2f313 1984
252b5132 1985 obfd->has_armap = ibfd->has_armap;
a8da6403 1986 obfd->is_thin_archive = ibfd->is_thin_archive;
252b5132
RH
1987
1988 list = NULL;
1989
1990 this_element = bfd_openr_next_archived_file (ibfd, NULL);
594ef5db 1991
b667df2e 1992 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
8d8e0703
AM
1993 {
1994 status = 1;
1995 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
1996 return;
1997 }
b667df2e 1998
d3ba0551 1999 while (!status && this_element != NULL)
252b5132 2000 {
4c168fa3
AM
2001 char *output_name;
2002 bfd *output_bfd;
252b5132 2003 bfd *last_element;
8066d1a2
AS
2004 struct stat buf;
2005 int stat_status = 0;
3f5e193b 2006 bfd_boolean del = TRUE;
8066d1a2 2007
4c168fa3
AM
2008 /* Create an output file for this member. */
2009 output_name = concat (dir, "/",
2010 bfd_get_filename (this_element), (char *) 0);
2011
2012 /* If the file already exists, make another temp dir. */
2013 if (stat (output_name, &buf) >= 0)
2014 {
f9c026a8
NC
2015 output_name = make_tempdir (output_name);
2016 if (output_name == NULL)
485be063
AM
2017 fatal (_("cannot create tempdir for archive copying (error: %s)"),
2018 strerror (errno));
84e2f313 2019
3f5e193b 2020 l = (struct name_list *) xmalloc (sizeof (struct name_list));
4c168fa3
AM
2021 l->name = output_name;
2022 l->next = list;
2023 l->obfd = NULL;
2024 list = l;
2025 output_name = concat (output_name, "/",
2026 bfd_get_filename (this_element), (char *) 0);
2027 }
2028
8066d1a2
AS
2029 if (preserve_dates)
2030 {
2031 stat_status = bfd_stat_arch_elt (this_element, &buf);
594ef5db 2032
8066d1a2
AS
2033 if (stat_status != 0)
2034 non_fatal (_("internal stat error on %s"),
2035 bfd_get_filename (this_element));
2036 }
252b5132 2037
3f5e193b 2038 l = (struct name_list *) xmalloc (sizeof (struct name_list));
252b5132
RH
2039 l->name = output_name;
2040 l->next = list;
bee59fd2 2041 l->obfd = NULL;
252b5132
RH
2042 list = l;
2043
b34976b6 2044 if (bfd_check_format (this_element, bfd_object))
77f762d6 2045 {
ee873e00
NC
2046 /* PR binutils/3110: Cope with archives
2047 containing multiple target types. */
2048 if (force_output_target)
2049 output_bfd = bfd_openw (output_name, output_target);
2050 else
2051 output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
2052
2053 if (output_bfd == NULL)
2db6cde7
NS
2054 {
2055 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2056 status = 1;
2057 return;
2058 }
ee873e00 2059
8b31b6c4 2060 del = ! copy_object (this_element, output_bfd, input_arch);
252b5132 2061
3f5e193b 2062 if (! del
77f762d6
L
2063 || bfd_get_arch (this_element) != bfd_arch_unknown)
2064 {
2065 if (!bfd_close (output_bfd))
2066 {
8d8e0703 2067 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
77f762d6
L
2068 /* Error in new object file. Don't change archive. */
2069 status = 1;
2070 }
2071 }
2072 else
2073 goto copy_unknown_element;
2074 }
2075 else
252b5132 2076 {
8d8e0703 2077 bfd_nonfatal_message (NULL, this_element, NULL,
2db6cde7 2078 _("Unable to recognise the format of file"));
77f762d6 2079
ee873e00 2080 output_bfd = bfd_openw (output_name, output_target);
77f762d6 2081copy_unknown_element:
3f5e193b 2082 del = !copy_unknown_object (this_element, output_bfd);
77f762d6
L
2083 if (!bfd_close_all_done (output_bfd))
2084 {
8d8e0703 2085 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
77f762d6
L
2086 /* Error in new object file. Don't change archive. */
2087 status = 1;
2088 }
252b5132
RH
2089 }
2090
3f5e193b 2091 if (del)
950d48e7
NC
2092 {
2093 unlink (output_name);
2094 status = 1;
2095 }
2096 else
2097 {
2098 if (preserve_dates && stat_status == 0)
2099 set_times (output_name, &buf);
8066d1a2 2100
950d48e7
NC
2101 /* Open the newly output file and attach to our list. */
2102 output_bfd = bfd_openr (output_name, output_target);
252b5132 2103
950d48e7 2104 l->obfd = output_bfd;
252b5132 2105
950d48e7 2106 *ptr = output_bfd;
cc481421 2107 ptr = &output_bfd->archive_next;
252b5132 2108
950d48e7 2109 last_element = this_element;
252b5132 2110
950d48e7 2111 this_element = bfd_openr_next_archived_file (ibfd, last_element);
252b5132 2112
950d48e7
NC
2113 bfd_close (last_element);
2114 }
252b5132 2115 }
d3ba0551 2116 *ptr = NULL;
252b5132 2117
8d8e0703 2118 filename = bfd_get_filename (obfd);
252b5132 2119 if (!bfd_close (obfd))
8d8e0703
AM
2120 {
2121 status = 1;
2122 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2123 return;
2124 }
252b5132 2125
8d8e0703 2126 filename = bfd_get_filename (ibfd);
252b5132 2127 if (!bfd_close (ibfd))
8d8e0703
AM
2128 {
2129 status = 1;
2130 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2131 return;
2132 }
252b5132
RH
2133
2134 /* Delete all the files that we opened. */
2135 for (l = list; l != NULL; l = l->next)
2136 {
4c168fa3
AM
2137 if (l->obfd == NULL)
2138 rmdir (l->name);
2139 else
2140 {
2141 bfd_close (l->obfd);
2142 unlink (l->name);
2143 }
252b5132
RH
2144 }
2145 rmdir (dir);
2146}
2147
0408dee6
DK
2148static void
2149set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
2150{
2151 /* This is only relevant to Coff targets. */
2152 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
2153 {
78e82dc3
AM
2154 if (style == KEEP
2155 && bfd_get_flavour (input_bfd) == bfd_target_coff_flavour)
0408dee6
DK
2156 style = bfd_coff_long_section_names (input_bfd) ? ENABLE : DISABLE;
2157 bfd_coff_set_long_section_names (output_bfd, style != DISABLE);
2158 }
2159}
2160
252b5132
RH
2161/* The top-level control. */
2162
2163static void
84e2f313 2164copy_file (const char *input_filename, const char *output_filename,
8b31b6c4
NC
2165 const char *input_target, const char *output_target,
2166 const bfd_arch_info_type *input_arch)
252b5132
RH
2167{
2168 bfd *ibfd;
49c12576
AM
2169 char **obj_matching;
2170 char **core_matching;
52a476ee 2171 off_t size = get_file_size (input_filename);
252b5132 2172
52a476ee 2173 if (size < 1)
f24ddbdd 2174 {
52a476ee
L
2175 if (size == 0)
2176 non_fatal (_("error: the input file '%s' is empty"),
2177 input_filename);
f24ddbdd
NC
2178 status = 1;
2179 return;
2180 }
2181
252b5132
RH
2182 /* To allow us to do "strip *" without dying on the first
2183 non-object file, failures are nonfatal. */
252b5132
RH
2184 ibfd = bfd_openr (input_filename, input_target);
2185 if (ibfd == NULL)
2db6cde7
NS
2186 {
2187 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2188 status = 1;
2189 return;
2190 }
252b5132
RH
2191
2192 if (bfd_check_format (ibfd, bfd_archive))
2193 {
ee873e00 2194 bfd_boolean force_output_target;
252b5132
RH
2195 bfd *obfd;
2196
2197 /* bfd_get_target does not return the correct value until
2198 bfd_check_format succeeds. */
2199 if (output_target == NULL)
ee873e00
NC
2200 {
2201 output_target = bfd_get_target (ibfd);
2202 force_output_target = FALSE;
2203 }
2204 else
2205 force_output_target = TRUE;
252b5132
RH
2206
2207 obfd = bfd_openw (output_filename, output_target);
2208 if (obfd == NULL)
2db6cde7
NS
2209 {
2210 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2211 status = 1;
2212 return;
2213 }
0408dee6
DK
2214 /* This is a no-op on non-Coff targets. */
2215 set_long_section_mode (obfd, ibfd, long_section_names);
252b5132 2216
8b31b6c4 2217 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
252b5132 2218 }
49c12576 2219 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
252b5132
RH
2220 {
2221 bfd *obfd;
49c12576 2222 do_copy:
950d48e7 2223
252b5132
RH
2224 /* bfd_get_target does not return the correct value until
2225 bfd_check_format succeeds. */
2226 if (output_target == NULL)
2227 output_target = bfd_get_target (ibfd);
2228
2229 obfd = bfd_openw (output_filename, output_target);
2230 if (obfd == NULL)
2db6cde7
NS
2231 {
2232 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2233 status = 1;
2234 return;
2235 }
0408dee6
DK
2236 /* This is a no-op on non-Coff targets. */
2237 set_long_section_mode (obfd, ibfd, long_section_names);
252b5132 2238
8b31b6c4 2239 if (! copy_object (ibfd, obfd, input_arch))
a580b8e0 2240 status = 1;
252b5132
RH
2241
2242 if (!bfd_close (obfd))
8d8e0703
AM
2243 {
2244 status = 1;
2245 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2246 return;
2247 }
252b5132
RH
2248
2249 if (!bfd_close (ibfd))
8d8e0703
AM
2250 {
2251 status = 1;
2252 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2253 return;
2254 }
252b5132
RH
2255 }
2256 else
2257 {
49c12576
AM
2258 bfd_error_type obj_error = bfd_get_error ();
2259 bfd_error_type core_error;
b34976b6 2260
49c12576
AM
2261 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
2262 {
2263 /* This probably can't happen.. */
2264 if (obj_error == bfd_error_file_ambiguously_recognized)
2265 free (obj_matching);
2266 goto do_copy;
2267 }
2268
2269 core_error = bfd_get_error ();
2270 /* Report the object error in preference to the core error. */
2271 if (obj_error != core_error)
2272 bfd_set_error (obj_error);
2273
2db6cde7 2274 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
57938635 2275
49c12576
AM
2276 if (obj_error == bfd_error_file_ambiguously_recognized)
2277 {
2278 list_matching_formats (obj_matching);
2279 free (obj_matching);
2280 }
2281 if (core_error == bfd_error_file_ambiguously_recognized)
252b5132 2282 {
49c12576
AM
2283 list_matching_formats (core_matching);
2284 free (core_matching);
252b5132 2285 }
57938635 2286
252b5132
RH
2287 status = 1;
2288 }
2289}
2290
594ef5db
NC
2291/* Add a name to the section renaming list. */
2292
2293static void
84e2f313
NC
2294add_section_rename (const char * old_name, const char * new_name,
2295 flagword flags)
594ef5db 2296{
91d6fa6a 2297 section_rename * srename;
594ef5db
NC
2298
2299 /* Check for conflicts first. */
91d6fa6a
NC
2300 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2301 if (strcmp (srename->old_name, old_name) == 0)
594ef5db
NC
2302 {
2303 /* Silently ignore duplicate definitions. */
91d6fa6a
NC
2304 if (strcmp (srename->new_name, new_name) == 0
2305 && srename->flags == flags)
594ef5db 2306 return;
0af11b59 2307
594ef5db
NC
2308 fatal (_("Multiple renames of section %s"), old_name);
2309 }
2310
91d6fa6a 2311 srename = (section_rename *) xmalloc (sizeof (* srename));
594ef5db 2312
91d6fa6a
NC
2313 srename->old_name = old_name;
2314 srename->new_name = new_name;
2315 srename->flags = flags;
2316 srename->next = section_rename_list;
0af11b59 2317
91d6fa6a 2318 section_rename_list = srename;
594ef5db
NC
2319}
2320
2321/* Check the section rename list for a new name of the input section
2322 ISECTION. Return the new name if one is found.
2323 Also set RETURNED_FLAGS to the flags to be used for this section. */
2324
2325static const char *
84e2f313
NC
2326find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
2327 flagword * returned_flags)
594ef5db
NC
2328{
2329 const char * old_name = bfd_section_name (ibfd, isection);
91d6fa6a 2330 section_rename * srename;
594ef5db
NC
2331
2332 /* Default to using the flags of the input section. */
2333 * returned_flags = bfd_get_section_flags (ibfd, isection);
2334
91d6fa6a
NC
2335 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2336 if (strcmp (srename->old_name, old_name) == 0)
594ef5db 2337 {
91d6fa6a
NC
2338 if (srename->flags != (flagword) -1)
2339 * returned_flags = srename->flags;
594ef5db 2340
91d6fa6a 2341 return srename->new_name;
594ef5db
NC
2342 }
2343
2344 return old_name;
2345}
2346
80fccad2
BW
2347/* Once each of the sections is copied, we may still need to do some
2348 finalization work for private section headers. Do that here. */
2349
2350static void
2351setup_bfd_headers (bfd *ibfd, bfd *obfd)
2352{
80fccad2
BW
2353 /* Allow the BFD backend to copy any private data it understands
2354 from the input section to the output section. */
2355 if (! bfd_copy_private_header_data (ibfd, obfd))
2356 {
2db6cde7
NS
2357 status = 1;
2358 bfd_nonfatal_message (NULL, ibfd, NULL,
8d8e0703 2359 _("error in private header data"));
2db6cde7 2360 return;
80fccad2
BW
2361 }
2362
2363 /* All went well. */
2364 return;
80fccad2
BW
2365}
2366
594ef5db
NC
2367/* Create a section in OBFD with the same
2368 name and attributes as ISECTION in IBFD. */
252b5132
RH
2369
2370static void
84e2f313 2371setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
252b5132 2372{
3f5e193b 2373 bfd *obfd = (bfd *) obfdarg;
252b5132
RH
2374 struct section_list *p;
2375 sec_ptr osection;
2376 bfd_size_type size;
2377 bfd_vma vma;
2378 bfd_vma lma;
2379 flagword flags;
1a89cc7d 2380 const char *err;
594ef5db 2381 const char * name;
d7fb0dd2 2382 char *prefix = NULL;
66125551 2383 bfd_boolean make_nobits;
0af11b59 2384
2593f09a 2385 if (is_strip_section (ibfd, isection))
252b5132
RH
2386 return;
2387
b34976b6 2388 p = find_section_list (bfd_section_name (ibfd, isection), FALSE);
252b5132 2389 if (p != NULL)
b34976b6 2390 p->used = TRUE;
252b5132 2391
594ef5db
NC
2392 /* Get the, possibly new, name of the output section. */
2393 name = find_section_rename (ibfd, isection, & flags);
0af11b59 2394
d7fb0dd2 2395 /* Prefix sections. */
84e2f313
NC
2396 if ((prefix_alloc_sections_string)
2397 && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
d7fb0dd2
NC
2398 prefix = prefix_alloc_sections_string;
2399 else if (prefix_sections_string)
2400 prefix = prefix_sections_string;
2401
2402 if (prefix)
2403 {
2404 char *n;
2405
3f5e193b 2406 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
d7fb0dd2
NC
2407 strcpy (n, prefix);
2408 strcat (n, name);
2409 name = n;
2410 }
66491ebc 2411
66125551 2412 make_nobits = FALSE;
551b43fd
AM
2413 if (p != NULL && p->set_flags)
2414 flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
42bb2e33 2415 else if (strip_symbols == STRIP_NONDEBUG
6c67a030
AM
2416 && (flags & (SEC_ALLOC | SEC_GROUP)) != 0
2417 && !(ibfd->xvec->flavour == bfd_target_elf_flavour
2418 && elf_section_type (isection) == SHT_NOTE))
66125551 2419 {
6c67a030 2420 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
66125551
AM
2421 if (obfd->xvec->flavour == bfd_target_elf_flavour)
2422 {
2423 make_nobits = TRUE;
2424
2425 /* Twiddle the input section flags so that it seems to
2426 elf.c:copy_private_bfd_data that section flags have not
2427 changed between input and output sections. This hack
2428 prevents wholesale rewriting of the program headers. */
6c67a030 2429 isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD | SEC_GROUP);
66125551
AM
2430 }
2431 }
551b43fd
AM
2432
2433 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
57938635 2434
252b5132
RH
2435 if (osection == NULL)
2436 {
2db6cde7 2437 err = _("failed to create output section");
252b5132
RH
2438 goto loser;
2439 }
2440
66125551 2441 if (make_nobits)
551b43fd
AM
2442 elf_section_type (osection) = SHT_NOBITS;
2443
252b5132
RH
2444 size = bfd_section_size (ibfd, isection);
2445 if (copy_byte >= 0)
2446 size = (size + interleave - 1) / interleave;
d3e52d40
RS
2447 else if (extract_symbol)
2448 size = 0;
252b5132
RH
2449 if (! bfd_set_section_size (obfd, osection, size))
2450 {
2db6cde7 2451 err = _("failed to set size");
252b5132
RH
2452 goto loser;
2453 }
57938635 2454
252b5132
RH
2455 vma = bfd_section_vma (ibfd, isection);
2456 if (p != NULL && p->change_vma == CHANGE_MODIFY)
2457 vma += p->vma_val;
2458 else if (p != NULL && p->change_vma == CHANGE_SET)
2459 vma = p->vma_val;
2460 else
2461 vma += change_section_address;
57938635 2462
237dcb53 2463 if (! bfd_set_section_vma (obfd, osection, vma))
252b5132 2464 {
2db6cde7 2465 err = _("failed to set vma");
252b5132
RH
2466 goto loser;
2467 }
2468
2469 lma = isection->lma;
2470 if ((p != NULL) && p->change_lma != CHANGE_IGNORE)
2471 {
2472 if (p->change_lma == CHANGE_MODIFY)
2473 lma += p->lma_val;
2474 else if (p->change_lma == CHANGE_SET)
2475 lma = p->lma_val;
2476 else
2477 abort ();
2478 }
2479 else
2480 lma += change_section_address;
57938635 2481
237dcb53 2482 osection->lma = lma;
252b5132
RH
2483
2484 /* FIXME: This is probably not enough. If we change the LMA we
2485 may have to recompute the header for the file as well. */
b34976b6
AM
2486 if (!bfd_set_section_alignment (obfd,
2487 osection,
2488 bfd_section_alignment (ibfd, isection)))
252b5132 2489 {
2db6cde7 2490 err = _("failed to set alignment");
252b5132
RH
2491 goto loser;
2492 }
2493
bc408b8a
JJ
2494 /* Copy merge entity size. */
2495 osection->entsize = isection->entsize;
2496
252b5132
RH
2497 /* This used to be mangle_section; we do here to avoid using
2498 bfd_get_section_by_name since some formats allow multiple
2499 sections with the same name. */
2500 isection->output_section = osection;
237dcb53 2501 isection->output_offset = 0;
d3e52d40
RS
2502
2503 /* Do not copy backend data if --extract-symbol is passed; anything
2504 that needs to look at the section contents will fail. */
2505 if (extract_symbol)
2506 return;
252b5132 2507
119f4245
AM
2508 if ((isection->flags & SEC_GROUP) != 0)
2509 {
2510 asymbol *gsym = group_signature (isection);
2511
2512 if (gsym != NULL)
2513 {
2514 gsym->flags |= BSF_KEEP;
2515 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
2516 elf_group_id (isection) = gsym;
2517 }
2518 }
2519
252b5132
RH
2520 /* Allow the BFD backend to copy any private data it understands
2521 from the input section to the output section. */
42bb2e33 2522 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
252b5132 2523 {
2db6cde7 2524 err = _("failed to copy private data");
252b5132
RH
2525 goto loser;
2526 }
2527
594ef5db 2528 /* All went well. */
252b5132
RH
2529 return;
2530
2531loser:
252b5132 2532 status = 1;
2db6cde7 2533 bfd_nonfatal_message (NULL, obfd, osection, err);
252b5132
RH
2534}
2535
2536/* Copy the data of input section ISECTION of IBFD
2537 to an output section with the same name in OBFD.
2538 If stripping then don't copy any relocation info. */
2539
2540static void
84e2f313 2541copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
252b5132 2542{
3f5e193b 2543 bfd *obfd = (bfd *) obfdarg;
252b5132
RH
2544 struct section_list *p;
2545 arelent **relpp;
2546 long relcount;
2547 sec_ptr osection;
2548 bfd_size_type size;
2549 long relsize;
dc156bc0 2550 flagword flags;
252b5132 2551
594ef5db
NC
2552 /* If we have already failed earlier on,
2553 do not keep on generating complaints now. */
252b5132
RH
2554 if (status != 0)
2555 return;
57938635 2556
2593f09a 2557 if (is_strip_section (ibfd, isection))
e0c60db2 2558 return;
252b5132 2559
2593f09a 2560 flags = bfd_get_section_flags (ibfd, isection);
dc156bc0
AM
2561 if ((flags & SEC_GROUP) != 0)
2562 return;
2563
252b5132 2564 osection = isection->output_section;
135dfb4a 2565 size = bfd_get_section_size (isection);
252b5132
RH
2566
2567 if (size == 0 || osection == 0)
2568 return;
2569
237dcb53
AM
2570 if (extract_symbol)
2571 return;
2572
2593f09a
NC
2573 p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE);
2574
0af11b59 2575 /* Core files do not need to be relocated. */
4dd67f29
MS
2576 if (bfd_get_format (obfd) == bfd_core)
2577 relsize = 0;
2578 else
ed570f48
NC
2579 {
2580 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
4dd67f29 2581
ed570f48
NC
2582 if (relsize < 0)
2583 {
2584 /* Do not complain if the target does not support relocations. */
2585 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2586 relsize = 0;
2587 else
2db6cde7
NS
2588 {
2589 status = 1;
2590 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2591 return;
2592 }
ed570f48
NC
2593 }
2594 }
57938635 2595
252b5132 2596 if (relsize == 0)
d3ba0551 2597 bfd_set_reloc (obfd, osection, NULL, 0);
252b5132
RH
2598 else
2599 {
3f5e193b 2600 relpp = (arelent **) xmalloc (relsize);
252b5132
RH
2601 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
2602 if (relcount < 0)
2db6cde7
NS
2603 {
2604 status = 1;
2605 bfd_nonfatal_message (NULL, ibfd, isection,
2606 _("relocation count is negative"));
2607 return;
2608 }
57938635 2609
252b5132
RH
2610 if (strip_symbols == STRIP_ALL)
2611 {
2612 /* Remove relocations which are not in
0af11b59 2613 keep_strip_specific_list. */
252b5132
RH
2614 arelent **temp_relpp;
2615 long temp_relcount = 0;
2616 long i;
57938635 2617
3f5e193b 2618 temp_relpp = (arelent **) xmalloc (relsize);
252b5132 2619 for (i = 0; i < relcount; i++)
d3ba0551 2620 if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
047c9024 2621 keep_specific_htab))
252b5132
RH
2622 temp_relpp [temp_relcount++] = relpp [i];
2623 relcount = temp_relcount;
2624 free (relpp);
2625 relpp = temp_relpp;
2626 }
e0c60db2 2627
d3ba0551 2628 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
f0312d39
JJ
2629 if (relcount == 0)
2630 free (relpp);
252b5132 2631 }
57938635 2632
0af11b59 2633 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
4dd67f29 2634 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
252b5132 2635 {
d3ba0551 2636 void *memhunk = xmalloc (size);
252b5132 2637
d3ba0551 2638 if (!bfd_get_section_contents (ibfd, isection, memhunk, 0, size))
2db6cde7
NS
2639 {
2640 status = 1;
2641 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2642 return;
2643 }
252b5132 2644
9e48b4c6
NC
2645 if (reverse_bytes)
2646 {
2647 /* We don't handle leftover bytes (too many possible behaviors,
2648 and we don't know what the user wants). The section length
2649 must be a multiple of the number of bytes to swap. */
2650 if ((size % reverse_bytes) == 0)
2651 {
2652 unsigned long i, j;
2653 bfd_byte b;
2654
2655 for (i = 0; i < size; i += reverse_bytes)
2656 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
2657 {
2658 bfd_byte *m = (bfd_byte *) memhunk;
2659
2660 b = m[i + j];
2661 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
2662 m[(i + reverse_bytes) - (j + 1)] = b;
2663 }
2664 }
2665 else
2666 /* User must pad the section up in order to do this. */
2667 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
2668 bfd_section_name (ibfd, isection), reverse_bytes);
2669 }
2670
57938635 2671 if (copy_byte >= 0)
5e675b72
AM
2672 {
2673 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2f01ffbf 2674 char *from = (char *) memhunk + copy_byte;
3f5e193b 2675 char *to = (char *) memhunk;
2f01ffbf 2676 char *end = (char *) memhunk + size;
5e675b72
AM
2677
2678 for (; from < end; from += interleave)
2679 *to++ = *from;
2680
2681 size = (size + interleave - 1 - copy_byte) / interleave;
2682 osection->lma /= interleave;
2683 }
252b5132 2684
d3ba0551 2685 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2db6cde7
NS
2686 {
2687 status = 1;
2688 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2689 return;
2690 }
252b5132
RH
2691 free (memhunk);
2692 }
2693 else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
2694 {
d3ba0551 2695 void *memhunk = xmalloc (size);
252b5132
RH
2696
2697 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2698 flag--they can just remove the section entirely and add it
2699 back again. However, we do permit them to turn on the
2700 SEC_HAS_CONTENTS flag, and take it to mean that the section
2701 contents should be zeroed out. */
2702
2703 memset (memhunk, 0, size);
d3ba0551 2704 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2db6cde7
NS
2705 {
2706 status = 1;
2707 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2708 return;
2709 }
252b5132
RH
2710 free (memhunk);
2711 }
2712}
2713
2714/* Get all the sections. This is used when --gap-fill or --pad-to is
2715 used. */
2716
2717static void
84e2f313 2718get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
252b5132 2719{
3f5e193b 2720 asection ***secppp = (asection ***) secppparg;
252b5132
RH
2721
2722 **secppp = osection;
2723 ++(*secppp);
2724}
2725
2726/* Sort sections by VMA. This is called via qsort, and is used when
2727 --gap-fill or --pad-to is used. We force non loadable or empty
2728 sections to the front, where they are easier to ignore. */
2729
2730static int
84e2f313 2731compare_section_lma (const void *arg1, const void *arg2)
252b5132 2732{
3f5e193b
NC
2733 const asection *const *sec1 = (const asection * const *) arg1;
2734 const asection *const *sec2 = (const asection * const *) arg2;
252b5132
RH
2735 flagword flags1, flags2;
2736
2737 /* Sort non loadable sections to the front. */
2738 flags1 = (*sec1)->flags;
2739 flags2 = (*sec2)->flags;
2740 if ((flags1 & SEC_HAS_CONTENTS) == 0
2741 || (flags1 & SEC_LOAD) == 0)
2742 {
2743 if ((flags2 & SEC_HAS_CONTENTS) != 0
2744 && (flags2 & SEC_LOAD) != 0)
2745 return -1;
2746 }
2747 else
2748 {
2749 if ((flags2 & SEC_HAS_CONTENTS) == 0
2750 || (flags2 & SEC_LOAD) == 0)
2751 return 1;
2752 }
2753
2754 /* Sort sections by LMA. */
2755 if ((*sec1)->lma > (*sec2)->lma)
2756 return 1;
2757 else if ((*sec1)->lma < (*sec2)->lma)
2758 return -1;
2759
2760 /* Sort sections with the same LMA by size. */
135dfb4a 2761 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
252b5132 2762 return 1;
135dfb4a 2763 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
252b5132
RH
2764 return -1;
2765
2766 return 0;
2767}
2768
2769/* Mark all the symbols which will be used in output relocations with
2770 the BSF_KEEP flag so that those symbols will not be stripped.
2771
2772 Ignore relocations which will not appear in the output file. */
2773
2774static void
84e2f313 2775mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
252b5132 2776{
3f5e193b 2777 asymbol **symbols = (asymbol **) symbolsarg;
252b5132
RH
2778 long relsize;
2779 arelent **relpp;
2780 long relcount, i;
2781
2782 /* Ignore an input section with no corresponding output section. */
2783 if (isection->output_section == NULL)
2784 return;
2785
2786 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2787 if (relsize < 0)
ed570f48
NC
2788 {
2789 /* Do not complain if the target does not support relocations. */
2790 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2791 return;
2792 bfd_fatal (bfd_get_filename (ibfd));
2793 }
252b5132
RH
2794
2795 if (relsize == 0)
2796 return;
2797
3f5e193b 2798 relpp = (arelent **) xmalloc (relsize);
252b5132
RH
2799 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
2800 if (relcount < 0)
2801 bfd_fatal (bfd_get_filename (ibfd));
2802
ec5d57d5
NC
2803 /* Examine each symbol used in a relocation. If it's not one of the
2804 special bfd section symbols, then mark it with BSF_KEEP. */
252b5132
RH
2805 for (i = 0; i < relcount; i++)
2806 {
ec5d57d5
NC
2807 if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
2808 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
2809 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
2810 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
252b5132
RH
2811 }
2812
2813 if (relpp != NULL)
2814 free (relpp);
2815}
2816
2817/* Write out debugging information. */
2818
b34976b6 2819static bfd_boolean
84e2f313
NC
2820write_debugging_info (bfd *obfd, void *dhandle,
2821 long *symcountp ATTRIBUTE_UNUSED,
2822 asymbol ***symppp ATTRIBUTE_UNUSED)
252b5132
RH
2823{
2824 if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
2825 return write_ieee_debugging_info (obfd, dhandle);
2826
2827 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2828 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2829 {
2830 bfd_byte *syms, *strings;
2831 bfd_size_type symsize, stringsize;
2832 asection *stabsec, *stabstrsec;
551b43fd 2833 flagword flags;
252b5132
RH
2834
2835 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
2836 &symsize, &strings,
2837 &stringsize))
b34976b6 2838 return FALSE;
252b5132 2839
551b43fd
AM
2840 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
2841 stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
2842 stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
252b5132
RH
2843 if (stabsec == NULL
2844 || stabstrsec == NULL
2845 || ! bfd_set_section_size (obfd, stabsec, symsize)
2846 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
2847 || ! bfd_set_section_alignment (obfd, stabsec, 2)
551b43fd 2848 || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
252b5132 2849 {
2db6cde7
NS
2850 bfd_nonfatal_message (NULL, obfd, NULL,
2851 _("can't create debugging section"));
b34976b6 2852 return FALSE;
252b5132
RH
2853 }
2854
2855 /* We can get away with setting the section contents now because
2856 the next thing the caller is going to do is copy over the
2857 real sections. We may someday have to split the contents
2858 setting out of this function. */
d3ba0551
AM
2859 if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
2860 || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
2861 stringsize))
252b5132 2862 {
2db6cde7
NS
2863 bfd_nonfatal_message (NULL, obfd, NULL,
2864 _("can't set debugging section contents"));
b34976b6 2865 return FALSE;
252b5132
RH
2866 }
2867
b34976b6 2868 return TRUE;
252b5132
RH
2869 }
2870
2db6cde7
NS
2871 bfd_nonfatal_message (NULL, obfd, NULL,
2872 _("don't know how to write debugging information for %s"),
2873 bfd_get_target (obfd));
b34976b6 2874 return FALSE;
252b5132
RH
2875}
2876
2877static int
84e2f313 2878strip_main (int argc, char *argv[])
252b5132 2879{
7c29036b
NC
2880 char *input_target = NULL;
2881 char *output_target = NULL;
b34976b6 2882 bfd_boolean show_version = FALSE;
7c29036b
NC
2883 bfd_boolean formats_info = FALSE;
2884 int c;
2885 int i;
252b5132
RH
2886 struct section_list *p;
2887 char *output_file = NULL;
2888
5fe11841 2889 while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
252b5132
RH
2890 strip_options, (int *) 0)) != EOF)
2891 {
2892 switch (c)
2893 {
2894 case 'I':
2895 input_target = optarg;
2896 break;
2897 case 'O':
2898 output_target = optarg;
2899 break;
2900 case 'F':
2901 input_target = output_target = optarg;
2902 break;
2903 case 'R':
b34976b6
AM
2904 p = find_section_list (optarg, TRUE);
2905 p->remove = TRUE;
2906 sections_removed = TRUE;
252b5132
RH
2907 break;
2908 case 's':
2909 strip_symbols = STRIP_ALL;
2910 break;
2911 case 'S':
2912 case 'g':
db4f6831 2913 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
252b5132
RH
2914 strip_symbols = STRIP_DEBUG;
2915 break;
2916 case OPTION_STRIP_UNNEEDED:
2917 strip_symbols = STRIP_UNNEEDED;
2918 break;
2919 case 'K':
047c9024 2920 add_specific_symbol (optarg, keep_specific_htab);
252b5132
RH
2921 break;
2922 case 'N':
047c9024 2923 add_specific_symbol (optarg, strip_specific_htab);
252b5132
RH
2924 break;
2925 case 'o':
2926 output_file = optarg;
2927 break;
2928 case 'p':
b34976b6 2929 preserve_dates = TRUE;
252b5132
RH
2930 break;
2931 case 'x':
2932 discard_locals = LOCALS_ALL;
2933 break;
2934 case 'X':
2935 discard_locals = LOCALS_START_L;
2936 break;
2937 case 'v':
b34976b6 2938 verbose = TRUE;
252b5132
RH
2939 break;
2940 case 'V':
b34976b6 2941 show_version = TRUE;
252b5132 2942 break;
7c29036b
NC
2943 case OPTION_FORMATS_INFO:
2944 formats_info = TRUE;
2945 break;
ed1653a7
NC
2946 case OPTION_ONLY_KEEP_DEBUG:
2947 strip_symbols = STRIP_NONDEBUG;
2948 break;
1637cd90
JB
2949 case OPTION_KEEP_FILE_SYMBOLS:
2950 keep_file_symbols = 1;
2951 break;
252b5132 2952 case 0:
594ef5db
NC
2953 /* We've been given a long option. */
2954 break;
5fe11841
NC
2955 case 'w':
2956 wildcard = TRUE;
2957 break;
8b53311e 2958 case 'H':
252b5132
RH
2959 case 'h':
2960 strip_usage (stdout, 0);
2961 default:
2962 strip_usage (stderr, 1);
2963 }
2964 }
2965
84e2f313
NC
2966 if (formats_info)
2967 {
2968 display_info ();
2969 return 0;
2970 }
c1c0eb9e 2971
252b5132
RH
2972 if (show_version)
2973 print_version ("strip");
2974
2975 /* Default is to strip all symbols. */
2976 if (strip_symbols == STRIP_UNDEF
2977 && discard_locals == LOCALS_UNDEF
047c9024 2978 && htab_elements (strip_specific_htab) == 0)
252b5132
RH
2979 strip_symbols = STRIP_ALL;
2980
d3ba0551 2981 if (output_target == NULL)
252b5132
RH
2982 output_target = input_target;
2983
2984 i = optind;
2985 if (i == argc
2986 || (output_file != NULL && (i + 1) < argc))
2987 strip_usage (stderr, 1);
2988
2989 for (; i < argc; i++)
2990 {
2991 int hold_status = status;
2992 struct stat statbuf;
2993 char *tmpname;
2994
f24ddbdd 2995 if (get_file_size (argv[i]) < 1)
d68c385b
NC
2996 {
2997 status = 1;
2998 continue;
2999 }
f24ddbdd 3000
252b5132 3001 if (preserve_dates)
f24ddbdd
NC
3002 /* No need to check the return value of stat().
3003 It has already been checked in get_file_size(). */
3004 stat (argv[i], &statbuf);
252b5132 3005
12f498a7 3006 if (output_file == NULL || strcmp (argv[i], output_file) == 0)
252b5132 3007 tmpname = make_tempname (argv[i]);
12f498a7
NS
3008 else
3009 tmpname = output_file;
252b5132 3010
f9c026a8
NC
3011 if (tmpname == NULL)
3012 {
2db6cde7
NS
3013 bfd_nonfatal_message (argv[i], NULL, NULL,
3014 _("could not create temporary file to hold stripped copy"));
f9c026a8
NC
3015 status = 1;
3016 continue;
3017 }
3018
d68c385b 3019 status = 0;
8b31b6c4 3020 copy_file (argv[i], tmpname, input_target, output_target, NULL);
252b5132
RH
3021 if (status == 0)
3022 {
3023 if (preserve_dates)
3024 set_times (tmpname, &statbuf);
12f498a7 3025 if (output_file != tmpname)
92fac5ec
L
3026 status = (smart_rename (tmpname,
3027 output_file ? output_file : argv[i],
3028 preserve_dates) != 0);
3029 if (status == 0)
3030 status = hold_status;
252b5132
RH
3031 }
3032 else
bb14f524 3033 unlink_if_ordinary (tmpname);
12f498a7 3034 if (output_file != tmpname)
252b5132
RH
3035 free (tmpname);
3036 }
3037
d68c385b 3038 return status;
252b5132
RH
3039}
3040
92dd4511
L
3041/* Set up PE subsystem. */
3042
3043static void
3044set_pe_subsystem (const char *s)
3045{
3046 const char *version, *subsystem;
3047 size_t i;
3048 static const struct
3049 {
3050 const char *name;
3051 const char set_def;
3052 const short value;
3053 }
3054 v[] =
3055 {
3056 { "native", 0, IMAGE_SUBSYSTEM_NATIVE },
3057 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI },
3058 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI },
3059 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI },
3060 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI },
3061 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION },
3062 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER },
3063 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER },
d9118602 3064 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER },
92dd4511
L
3065 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX }
3066 };
3067 short value;
3068 char *copy;
3069 int set_def = -1;
3070
3071 /* Check for the presence of a version number. */
3072 version = strchr (s, ':');
3073 if (version == NULL)
3074 subsystem = s;
3075 else
3076 {
3077 int len = version - s;
3078 copy = xstrdup (s);
3079 subsystem = copy;
3080 copy[len] = '\0';
3081 version = copy + 1 + len;
3082 pe_major_subsystem_version = strtoul (version, &copy, 0);
3083 if (*copy == '.')
3084 pe_minor_subsystem_version = strtoul (copy + 1, &copy, 0);
3085 if (*copy != '\0')
3086 non_fatal (_("%s: bad version in PE subsystem"), s);
3087 }
3088
3089 /* Check for numeric subsystem. */
3090 value = (short) strtol (subsystem, &copy, 0);
3091 if (*copy == '\0')
3092 {
3093 for (i = 0; i < ARRAY_SIZE (v); i++)
3094 if (v[i].value == value)
3095 {
3096 pe_subsystem = value;
3097 set_def = v[i].set_def;
3098 break;
3099 }
3100 }
3101 else
3102 {
3103 /* Search for subsystem by name. */
3104 for (i = 0; i < ARRAY_SIZE (v); i++)
3105 if (strcmp (subsystem, v[i].name) == 0)
3106 {
3107 pe_subsystem = v[i].value;
3108 set_def = v[i].set_def;
3109 break;
3110 }
3111 }
3112
3113 switch (set_def)
3114 {
3115 case -1:
3116 fatal (_("unknown PE subsystem: %s"), s);
3117 break;
3118 case 0:
3119 break;
3120 default:
3121 if (pe_file_alignment == (bfd_vma) -1)
3122 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
3123 if (pe_section_alignment == (bfd_vma) -1)
3124 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
3125 break;
3126 }
3127}
3128
3129/* Convert EFI target to PEI target. */
3130
3131static void
3132convert_efi_target (char *efi)
3133{
3134 efi[0] = 'p';
3135 efi[1] = 'e';
3136 efi[2] = 'i';
3137
3138 if (strcmp (efi + 4, "ia32") == 0)
3139 {
3140 /* Change ia32 to i386. */
3141 efi[5]= '3';
3142 efi[6]= '8';
3143 efi[7]= '6';
3144 }
3145 else if (strcmp (efi + 4, "x86_64") == 0)
3146 {
3147 /* Change x86_64 to x86-64. */
3148 efi[7] = '-';
3149 }
3150}
3151
252b5132 3152static int
84e2f313 3153copy_main (int argc, char *argv[])
252b5132 3154{
7c29036b
NC
3155 char *input_filename = NULL;
3156 char *output_filename = NULL;
c1c0eb9e 3157 char *tmpname;
7c29036b
NC
3158 char *input_target = NULL;
3159 char *output_target = NULL;
b34976b6
AM
3160 bfd_boolean show_version = FALSE;
3161 bfd_boolean change_warn = TRUE;
7c29036b 3162 bfd_boolean formats_info = FALSE;
252b5132
RH
3163 int c;
3164 struct section_list *p;
3165 struct stat statbuf;
8b31b6c4 3166 const bfd_arch_info_type *input_arch = NULL;
252b5132 3167
5fe11841 3168 while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
252b5132
RH
3169 copy_options, (int *) 0)) != EOF)
3170 {
3171 switch (c)
3172 {
3173 case 'b':
3174 copy_byte = atoi (optarg);
3175 if (copy_byte < 0)
3176 fatal (_("byte number must be non-negative"));
3177 break;
57938635 3178
0af11b59 3179 case 'B':
8b31b6c4
NC
3180 input_arch = bfd_scan_arch (optarg);
3181 if (input_arch == NULL)
3182 fatal (_("architecture %s unknown"), optarg);
0af11b59 3183 break;
43a0748c 3184
252b5132
RH
3185 case 'i':
3186 interleave = atoi (optarg);
3187 if (interleave < 1)
3188 fatal (_("interleave must be positive"));
3189 break;
57938635 3190
252b5132
RH
3191 case 'I':
3192 case 's': /* "source" - 'I' is preferred */
3193 input_target = optarg;
3194 break;
57938635 3195
252b5132
RH
3196 case 'O':
3197 case 'd': /* "destination" - 'O' is preferred */
3198 output_target = optarg;
3199 break;
57938635 3200
252b5132
RH
3201 case 'F':
3202 input_target = output_target = optarg;
3203 break;
57938635 3204
f91ea849 3205 case 'j':
b34976b6 3206 p = find_section_list (optarg, TRUE);
f91ea849
ILT
3207 if (p->remove)
3208 fatal (_("%s both copied and removed"), optarg);
b34976b6
AM
3209 p->copy = TRUE;
3210 sections_copied = TRUE;
f91ea849 3211 break;
57938635 3212
252b5132 3213 case 'R':
b34976b6 3214 p = find_section_list (optarg, TRUE);
f91ea849
ILT
3215 if (p->copy)
3216 fatal (_("%s both copied and removed"), optarg);
b34976b6
AM
3217 p->remove = TRUE;
3218 sections_removed = TRUE;
252b5132 3219 break;
57938635 3220
252b5132
RH
3221 case 'S':
3222 strip_symbols = STRIP_ALL;
3223 break;
57938635 3224
252b5132
RH
3225 case 'g':
3226 strip_symbols = STRIP_DEBUG;
3227 break;
57938635 3228
252b5132
RH
3229 case OPTION_STRIP_UNNEEDED:
3230 strip_symbols = STRIP_UNNEEDED;
3231 break;
57938635 3232
ed1653a7
NC
3233 case OPTION_ONLY_KEEP_DEBUG:
3234 strip_symbols = STRIP_NONDEBUG;
3235 break;
3236
1637cd90
JB
3237 case OPTION_KEEP_FILE_SYMBOLS:
3238 keep_file_symbols = 1;
3239 break;
3240
2593f09a
NC
3241 case OPTION_ADD_GNU_DEBUGLINK:
3242 gnu_debuglink_filename = optarg;
3243 break;
3244
252b5132 3245 case 'K':
047c9024 3246 add_specific_symbol (optarg, keep_specific_htab);
252b5132 3247 break;
57938635 3248
252b5132 3249 case 'N':
047c9024 3250 add_specific_symbol (optarg, strip_specific_htab);
252b5132 3251 break;
57938635 3252
bcf32829 3253 case OPTION_STRIP_UNNEEDED_SYMBOL:
047c9024 3254 add_specific_symbol (optarg, strip_unneeded_htab);
bcf32829
JB
3255 break;
3256
252b5132 3257 case 'L':
047c9024 3258 add_specific_symbol (optarg, localize_specific_htab);
252b5132 3259 break;
57938635 3260
7b4a0685 3261 case OPTION_GLOBALIZE_SYMBOL:
047c9024 3262 add_specific_symbol (optarg, globalize_specific_htab);
7b4a0685
NC
3263 break;
3264
16b2b71c 3265 case 'G':
047c9024 3266 add_specific_symbol (optarg, keepglobal_specific_htab);
16b2b71c
NC
3267 break;
3268
252b5132 3269 case 'W':
047c9024 3270 add_specific_symbol (optarg, weaken_specific_htab);
252b5132 3271 break;
57938635 3272
252b5132 3273 case 'p':
b34976b6 3274 preserve_dates = TRUE;
252b5132 3275 break;
57938635 3276
5fe11841
NC
3277 case 'w':
3278 wildcard = TRUE;
3279 break;
3280
252b5132
RH
3281 case 'x':
3282 discard_locals = LOCALS_ALL;
3283 break;
57938635 3284
252b5132
RH
3285 case 'X':
3286 discard_locals = LOCALS_START_L;
3287 break;
57938635 3288
252b5132 3289 case 'v':
b34976b6 3290 verbose = TRUE;
252b5132 3291 break;
57938635 3292
252b5132 3293 case 'V':
b34976b6 3294 show_version = TRUE;
252b5132 3295 break;
57938635 3296
7c29036b
NC
3297 case OPTION_FORMATS_INFO:
3298 formats_info = TRUE;
3299 break;
3300
252b5132 3301 case OPTION_WEAKEN:
b34976b6 3302 weaken = TRUE;
252b5132 3303 break;
57938635 3304
252b5132
RH
3305 case OPTION_ADD_SECTION:
3306 {
3307 const char *s;
500ee42e 3308 size_t off, alloc;
252b5132 3309 struct section_add *pa;
252b5132
RH
3310 FILE *f;
3311
3312 s = strchr (optarg, '=');
57938635 3313
252b5132 3314 if (s == NULL)
57938635 3315 fatal (_("bad format for %s"), "--add-section");
252b5132 3316
3f5e193b 3317 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
500ee42e 3318 pa->name = xstrndup (optarg, s - optarg);
252b5132
RH
3319 pa->filename = s + 1;
3320
500ee42e
ILT
3321 /* We don't use get_file_size so that we can do
3322 --add-section .note.GNU_stack=/dev/null
3323 get_file_size doesn't work on /dev/null. */
57938635 3324
500ee42e 3325 f = fopen (pa->filename, FOPEN_RB);
252b5132 3326 if (f == NULL)
84e2f313
NC
3327 fatal (_("cannot open: %s: %s"),
3328 pa->filename, strerror (errno));
57938635 3329
500ee42e
ILT
3330 off = 0;
3331 alloc = 4096;
3332 pa->contents = (bfd_byte *) xmalloc (alloc);
3333 while (!feof (f))
3334 {
3335 off_t got;
3336
3337 if (off == alloc)
3338 {
3339 alloc <<= 1;
3340 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
3341 }
3342
3343 got = fread (pa->contents + off, 1, alloc - off, f);
3344 if (ferror (f))
3345 fatal (_("%s: fread failed"), pa->filename);
3346
3347 off += got;
3348 }
3349
3350 pa->size = off;
252b5132
RH
3351
3352 fclose (f);
3353
3354 pa->next = add_sections;
3355 add_sections = pa;
3356 }
3357 break;
57938635 3358
252b5132
RH
3359 case OPTION_CHANGE_START:
3360 change_start = parse_vma (optarg, "--change-start");
3361 break;
57938635 3362
252b5132
RH
3363 case OPTION_CHANGE_SECTION_ADDRESS:
3364 case OPTION_CHANGE_SECTION_LMA:
3365 case OPTION_CHANGE_SECTION_VMA:
3366 {
3367 const char *s;
3368 int len;
3369 char *name;
b4c96d0d 3370 char *option = NULL;
252b5132 3371 bfd_vma val;
b4c96d0d 3372 enum change_action what = CHANGE_IGNORE;
57938635 3373
252b5132
RH
3374 switch (c)
3375 {
b4c96d0d
ILT
3376 case OPTION_CHANGE_SECTION_ADDRESS:
3377 option = "--change-section-address";
3378 break;
3379 case OPTION_CHANGE_SECTION_LMA:
3380 option = "--change-section-lma";
3381 break;
3382 case OPTION_CHANGE_SECTION_VMA:
3383 option = "--change-section-vma";
3384 break;
252b5132 3385 }
57938635 3386
252b5132
RH
3387 s = strchr (optarg, '=');
3388 if (s == NULL)
3389 {
3390 s = strchr (optarg, '+');
3391 if (s == NULL)
3392 {
3393 s = strchr (optarg, '-');
3394 if (s == NULL)
3395 fatal (_("bad format for %s"), option);
3396 }
3397 }
3398
3399 len = s - optarg;
3f5e193b 3400 name = (char *) xmalloc (len + 1);
252b5132
RH
3401 strncpy (name, optarg, len);
3402 name[len] = '\0';
3403
b34976b6 3404 p = find_section_list (name, TRUE);
252b5132
RH
3405
3406 val = parse_vma (s + 1, option);
3407
3408 switch (*s)
3409 {
3410 case '=': what = CHANGE_SET; break;
3411 case '-': val = - val; /* Drop through. */
3412 case '+': what = CHANGE_MODIFY; break;
3413 }
57938635 3414
252b5132
RH
3415 switch (c)
3416 {
3417 case OPTION_CHANGE_SECTION_ADDRESS:
3418 p->change_vma = what;
3419 p->vma_val = val;
3420 /* Drop through. */
57938635 3421
252b5132
RH
3422 case OPTION_CHANGE_SECTION_LMA:
3423 p->change_lma = what;
3424 p->lma_val = val;
3425 break;
57938635 3426
252b5132
RH
3427 case OPTION_CHANGE_SECTION_VMA:
3428 p->change_vma = what;
3429 p->vma_val = val;
3430 break;
3431 }
3432 }
3433 break;
57938635 3434
252b5132
RH
3435 case OPTION_CHANGE_ADDRESSES:
3436 change_section_address = parse_vma (optarg, "--change-addresses");
3437 change_start = change_section_address;
3438 break;
57938635 3439
252b5132 3440 case OPTION_CHANGE_WARNINGS:
b34976b6 3441 change_warn = TRUE;
252b5132 3442 break;
57938635 3443
252b5132 3444 case OPTION_CHANGE_LEADING_CHAR:
b34976b6 3445 change_leading_char = TRUE;
252b5132 3446 break;
57938635 3447
252b5132 3448 case OPTION_DEBUGGING:
b34976b6 3449 convert_debugging = TRUE;
252b5132 3450 break;
57938635 3451
252b5132
RH
3452 case OPTION_GAP_FILL:
3453 {
3454 bfd_vma gap_fill_vma;
3455
3456 gap_fill_vma = parse_vma (optarg, "--gap-fill");
3457 gap_fill = (bfd_byte) gap_fill_vma;
3458 if ((bfd_vma) gap_fill != gap_fill_vma)
3459 {
3460 char buff[20];
57938635 3461
252b5132 3462 sprintf_vma (buff, gap_fill_vma);
57938635 3463
252b5132
RH
3464 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3465 buff, gap_fill);
3466 }
b34976b6 3467 gap_fill_set = TRUE;
252b5132
RH
3468 }
3469 break;
57938635 3470
252b5132 3471 case OPTION_NO_CHANGE_WARNINGS:
b34976b6 3472 change_warn = FALSE;
252b5132 3473 break;
57938635 3474
252b5132
RH
3475 case OPTION_PAD_TO:
3476 pad_to = parse_vma (optarg, "--pad-to");
b34976b6 3477 pad_to_set = TRUE;
252b5132 3478 break;
57938635 3479
252b5132 3480 case OPTION_REMOVE_LEADING_CHAR:
b34976b6 3481 remove_leading_char = TRUE;
252b5132 3482 break;
57938635
AM
3483
3484 case OPTION_REDEFINE_SYM:
3485 {
3486 /* Push this redefinition onto redefine_symbol_list. */
3487
3488 int len;
3489 const char *s;
3490 const char *nextarg;
3491 char *source, *target;
3492
3493 s = strchr (optarg, '=');
3494 if (s == NULL)
594ef5db 3495 fatal (_("bad format for %s"), "--redefine-sym");
57938635
AM
3496
3497 len = s - optarg;
3f5e193b 3498 source = (char *) xmalloc (len + 1);
57938635
AM
3499 strncpy (source, optarg, len);
3500 source[len] = '\0';
3501
3502 nextarg = s + 1;
3503 len = strlen (nextarg);
3f5e193b 3504 target = (char *) xmalloc (len + 1);
57938635
AM
3505 strcpy (target, nextarg);
3506
92991082 3507 redefine_list_append ("--redefine-sym", source, target);
57938635
AM
3508
3509 free (source);
3510 free (target);
3511 }
3512 break;
3513
92991082
JT
3514 case OPTION_REDEFINE_SYMS:
3515 add_redefine_syms_file (optarg);
3516 break;
3517
252b5132
RH
3518 case OPTION_SET_SECTION_FLAGS:
3519 {
3520 const char *s;
3521 int len;
3522 char *name;
3523
3524 s = strchr (optarg, '=');
3525 if (s == NULL)
57938635 3526 fatal (_("bad format for %s"), "--set-section-flags");
252b5132
RH
3527
3528 len = s - optarg;
3f5e193b 3529 name = (char *) xmalloc (len + 1);
252b5132
RH
3530 strncpy (name, optarg, len);
3531 name[len] = '\0';
3532
b34976b6 3533 p = find_section_list (name, TRUE);
252b5132 3534
b34976b6 3535 p->set_flags = TRUE;
252b5132
RH
3536 p->flags = parse_flags (s + 1);
3537 }
3538 break;
57938635 3539
594ef5db
NC
3540 case OPTION_RENAME_SECTION:
3541 {
3542 flagword flags;
3bcfb3e4
AM
3543 const char *eq, *fl;
3544 char *old_name;
3545 char *new_name;
594ef5db
NC
3546 unsigned int len;
3547
3bcfb3e4
AM
3548 eq = strchr (optarg, '=');
3549 if (eq == NULL)
594ef5db
NC
3550 fatal (_("bad format for %s"), "--rename-section");
3551
3bcfb3e4 3552 len = eq - optarg;
594ef5db 3553 if (len == 0)
3bcfb3e4 3554 fatal (_("bad format for %s"), "--rename-section");
594ef5db 3555
3f5e193b 3556 old_name = (char *) xmalloc (len + 1);
594ef5db
NC
3557 strncpy (old_name, optarg, len);
3558 old_name[len] = 0;
3559
3bcfb3e4
AM
3560 eq++;
3561 fl = strchr (eq, ',');
3562 if (fl)
594ef5db 3563 {
3bcfb3e4
AM
3564 flags = parse_flags (fl + 1);
3565 len = fl - eq;
594ef5db
NC
3566 }
3567 else
3568 {
594ef5db 3569 flags = -1;
3bcfb3e4 3570 len = strlen (eq);
594ef5db
NC
3571 }
3572
3bcfb3e4
AM
3573 if (len == 0)
3574 fatal (_("bad format for %s"), "--rename-section");
3575
3f5e193b 3576 new_name = (char *) xmalloc (len + 1);
3bcfb3e4
AM
3577 strncpy (new_name, eq, len);
3578 new_name[len] = 0;
3579
594ef5db
NC
3580 add_section_rename (old_name, new_name, flags);
3581 }
3582 break;
3583
252b5132
RH
3584 case OPTION_SET_START:
3585 set_start = parse_vma (optarg, "--set-start");
b34976b6 3586 set_start_set = TRUE;
252b5132 3587 break;
57938635 3588
0af11b59
KH
3589 case OPTION_SREC_LEN:
3590 Chunk = parse_vma (optarg, "--srec-len");
3591 break;
420496c1 3592
0af11b59 3593 case OPTION_SREC_FORCES3:
b34976b6 3594 S3Forced = TRUE;
0af11b59 3595 break;
420496c1 3596
16b2b71c 3597 case OPTION_STRIP_SYMBOLS:
047c9024 3598 add_specific_symbols (optarg, strip_specific_htab);
16b2b71c
NC
3599 break;
3600
bcf32829 3601 case OPTION_STRIP_UNNEEDED_SYMBOLS:
047c9024 3602 add_specific_symbols (optarg, strip_unneeded_htab);
bcf32829
JB
3603 break;
3604
16b2b71c 3605 case OPTION_KEEP_SYMBOLS:
047c9024 3606 add_specific_symbols (optarg, keep_specific_htab);
16b2b71c
NC
3607 break;
3608
d58c2e3a
RS
3609 case OPTION_LOCALIZE_HIDDEN:
3610 localize_hidden = TRUE;
3611 break;
3612
16b2b71c 3613 case OPTION_LOCALIZE_SYMBOLS:
047c9024 3614 add_specific_symbols (optarg, localize_specific_htab);
16b2b71c
NC
3615 break;
3616
0408dee6
DK
3617 case OPTION_LONG_SECTION_NAMES:
3618 if (!strcmp ("enable", optarg))
3619 long_section_names = ENABLE;
3620 else if (!strcmp ("disable", optarg))
3621 long_section_names = DISABLE;
3622 else if (!strcmp ("keep", optarg))
3623 long_section_names = KEEP;
3624 else
3625 fatal (_("unknown long section names option '%s'"), optarg);
3626 break;
3627
7b4a0685 3628 case OPTION_GLOBALIZE_SYMBOLS:
047c9024 3629 add_specific_symbols (optarg, globalize_specific_htab);
7b4a0685
NC
3630 break;
3631
16b2b71c 3632 case OPTION_KEEPGLOBAL_SYMBOLS:
047c9024 3633 add_specific_symbols (optarg, keepglobal_specific_htab);
16b2b71c
NC
3634 break;
3635
3636 case OPTION_WEAKEN_SYMBOLS:
047c9024 3637 add_specific_symbols (optarg, weaken_specific_htab);
16b2b71c
NC
3638 break;
3639
1ae8b3d2 3640 case OPTION_ALT_MACH_CODE:
f9d4ad2a
NC
3641 use_alt_mach_code = strtoul (optarg, NULL, 0);
3642 if (use_alt_mach_code == 0)
3643 fatal (_("unable to parse alternative machine code"));
1ae8b3d2
AO
3644 break;
3645
d7fb0dd2
NC
3646 case OPTION_PREFIX_SYMBOLS:
3647 prefix_symbols_string = optarg;
3648 break;
3649
3650 case OPTION_PREFIX_SECTIONS:
3651 prefix_sections_string = optarg;
3652 break;
3653
3654 case OPTION_PREFIX_ALLOC_SECTIONS:
3655 prefix_alloc_sections_string = optarg;
3656 break;
3657
4087920c
MR
3658 case OPTION_READONLY_TEXT:
3659 bfd_flags_to_set |= WP_TEXT;
3660 bfd_flags_to_clear &= ~WP_TEXT;
3661 break;
3662
3663 case OPTION_WRITABLE_TEXT:
3664 bfd_flags_to_clear |= WP_TEXT;
3665 bfd_flags_to_set &= ~WP_TEXT;
3666 break;
3667
3668 case OPTION_PURE:
3669 bfd_flags_to_set |= D_PAGED;
3670 bfd_flags_to_clear &= ~D_PAGED;
3671 break;
3672
3673 case OPTION_IMPURE:
3674 bfd_flags_to_clear |= D_PAGED;
3675 bfd_flags_to_set &= ~D_PAGED;
3676 break;
3677
d3e52d40
RS
3678 case OPTION_EXTRACT_SYMBOL:
3679 extract_symbol = TRUE;
3680 break;
3681
9e48b4c6
NC
3682 case OPTION_REVERSE_BYTES:
3683 {
3684 int prev = reverse_bytes;
3685
3686 reverse_bytes = atoi (optarg);
3687 if ((reverse_bytes <= 0) || ((reverse_bytes % 2) != 0))
3688 fatal (_("number of bytes to reverse must be positive and even"));
3689
3690 if (prev && prev != reverse_bytes)
3691 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
3692 prev);
3693 break;
3694 }
3695
92dd4511
L
3696 case OPTION_FILE_ALIGNMENT:
3697 pe_file_alignment = parse_vma (optarg, "--file-alignment");
3698 break;
3699
3700 case OPTION_HEAP:
3701 {
3702 char *end;
3703 pe_heap_reserve = strtoul (optarg, &end, 0);
3704 if (end == optarg
3705 || (*end != '.' && *end != '\0'))
3706 non_fatal (_("%s: invalid reserve value for --heap"),
3707 optarg);
3708 else if (*end != '\0')
3709 {
3710 pe_heap_commit = strtoul (end + 1, &end, 0);
3711 if (*end != '\0')
3712 non_fatal (_("%s: invalid commit value for --heap"),
3713 optarg);
3714 }
3715 }
3716 break;
3717
3718 case OPTION_IMAGE_BASE:
3719 pe_image_base = parse_vma (optarg, "--image-base");
3720 break;
3721
3722 case OPTION_SECTION_ALIGNMENT:
3723 pe_section_alignment = parse_vma (optarg,
3724 "--section-alignment");
3725 break;
3726
3727 case OPTION_SUBSYSTEM:
3728 set_pe_subsystem (optarg);
3729 break;
3730
3731 case OPTION_STACK:
3732 {
3733 char *end;
3734 pe_stack_reserve = strtoul (optarg, &end, 0);
3735 if (end == optarg
3736 || (*end != '.' && *end != '\0'))
3737 non_fatal (_("%s: invalid reserve value for --stack"),
3738 optarg);
3739 else if (*end != '\0')
3740 {
3741 pe_stack_commit = strtoul (end + 1, &end, 0);
3742 if (*end != '\0')
3743 non_fatal (_("%s: invalid commit value for --stack"),
3744 optarg);
3745 }
3746 }
3747 break;
3748
252b5132 3749 case 0:
2593f09a
NC
3750 /* We've been given a long option. */
3751 break;
57938635 3752
8b53311e 3753 case 'H':
252b5132
RH
3754 case 'h':
3755 copy_usage (stdout, 0);
57938635 3756
252b5132
RH
3757 default:
3758 copy_usage (stderr, 1);
3759 }
3760 }
3761
7c29036b
NC
3762 if (formats_info)
3763 {
3764 display_info ();
3765 return 0;
3766 }
c1c0eb9e 3767
252b5132
RH
3768 if (show_version)
3769 print_version ("objcopy");
3770
3771 if (copy_byte >= interleave)
3772 fatal (_("byte number must be less than interleave"));
3773
3774 if (optind == argc || optind + 2 < argc)
3775 copy_usage (stderr, 1);
3776
3777 input_filename = argv[optind];
3778 if (optind + 1 < argc)
3779 output_filename = argv[optind + 1];
3780
3781 /* Default is to strip no symbols. */
3782 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
3783 strip_symbols = STRIP_NONE;
3784
d3ba0551 3785 if (output_target == NULL)
252b5132
RH
3786 output_target = input_target;
3787
92dd4511
L
3788 /* Convert input EFI target to PEI target. */
3789 if (input_target != NULL
3790 && strncmp (input_target, "efi-", 4) == 0)
3791 {
3792 char *efi;
3793
3794 efi = xstrdup (output_target + 4);
3795 if (strncmp (efi, "bsdrv-", 6) == 0
3796 || strncmp (efi, "rtdrv-", 6) == 0)
3797 efi += 2;
3798 else if (strncmp (efi, "app-", 4) != 0)
3799 fatal (_("unknown input EFI target: %s"), input_target);
3800
3801 input_target = efi;
3802 convert_efi_target (efi);
3803 }
3804
3805 /* Convert output EFI target to PEI target. */
3806 if (output_target != NULL
3807 && strncmp (output_target, "efi-", 4) == 0)
3808 {
3809 char *efi;
3810
3811 efi = xstrdup (output_target + 4);
3812 if (strncmp (efi, "app-", 4) == 0)
3813 {
3814 if (pe_subsystem == -1)
3815 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
3816 }
3817 else if (strncmp (efi, "bsdrv-", 6) == 0)
3818 {
3819 if (pe_subsystem == -1)
3820 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
3821 efi += 2;
3822 }
3823 else if (strncmp (efi, "rtdrv-", 6) == 0)
3824 {
3825 if (pe_subsystem == -1)
3826 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
3827 efi += 2;
3828 }
3829 else
3830 fatal (_("unknown output EFI target: %s"), output_target);
3831
3832 if (pe_file_alignment == (bfd_vma) -1)
3833 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
3834 if (pe_section_alignment == (bfd_vma) -1)
3835 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
3836
3837 output_target = efi;
3838 convert_efi_target (efi);
3839 }
3840
43a0748c
NC
3841 if (preserve_dates)
3842 if (stat (input_filename, & statbuf) < 0)
f24ddbdd
NC
3843 fatal (_("warning: could not locate '%s'. System error message: %s"),
3844 input_filename, strerror (errno));
43a0748c 3845
0fcdcb91 3846 /* If there is no destination file, or the source and destination files
d3ba0551
AM
3847 are the same, then create a temp and rename the result into the input. */
3848 if (output_filename == NULL || strcmp (input_filename, output_filename) == 0)
12f498a7 3849 tmpname = make_tempname (input_filename);
252b5132 3850 else
12f498a7 3851 tmpname = output_filename;
c1c0eb9e 3852
12f498a7
NS
3853 if (tmpname == NULL)
3854 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
3855 input_filename, strerror (errno));
594ef5db 3856
8b31b6c4 3857 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
12f498a7
NS
3858 if (status == 0)
3859 {
3860 if (preserve_dates)
3861 set_times (tmpname, &statbuf);
3862 if (tmpname != output_filename)
92fac5ec
L
3863 status = (smart_rename (tmpname, input_filename,
3864 preserve_dates) != 0);
252b5132 3865 }
12f498a7
NS
3866 else
3867 unlink_if_ordinary (tmpname);
252b5132
RH
3868
3869 if (change_warn)
3870 {
3871 for (p = change_sections; p != NULL; p = p->next)
3872 {
3873 if (! p->used)
3874 {
3875 if (p->change_vma != CHANGE_IGNORE)
3876 {
3877 char buff [20];
3878
3879 sprintf_vma (buff, p->vma_val);
57938635 3880
252b5132 3881 /* xgettext:c-format */
57938635
AM
3882 non_fatal (_("%s %s%c0x%s never used"),
3883 "--change-section-vma",
252b5132
RH
3884 p->name,
3885 p->change_vma == CHANGE_SET ? '=' : '+',
3886 buff);
3887 }
57938635 3888
252b5132
RH
3889 if (p->change_lma != CHANGE_IGNORE)
3890 {
3891 char buff [20];
3892
3893 sprintf_vma (buff, p->lma_val);
57938635 3894
252b5132 3895 /* xgettext:c-format */
57938635
AM
3896 non_fatal (_("%s %s%c0x%s never used"),
3897 "--change-section-lma",
252b5132
RH
3898 p->name,
3899 p->change_lma == CHANGE_SET ? '=' : '+',
3900 buff);
3901 }
3902 }
3903 }
3904 }
3905
3906 return 0;
3907}
3908
3909int
84e2f313 3910main (int argc, char *argv[])
252b5132
RH
3911{
3912#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
3913 setlocale (LC_MESSAGES, "");
3882b010
L
3914#endif
3915#if defined (HAVE_SETLOCALE)
3916 setlocale (LC_CTYPE, "");
252b5132
RH
3917#endif
3918 bindtextdomain (PACKAGE, LOCALEDIR);
3919 textdomain (PACKAGE);
3920
3921 program_name = argv[0];
3922 xmalloc_set_program_name (program_name);
3923
3924 START_PROGRESS (program_name, 0);
3925
869b9d07
MM
3926 expandargv (&argc, &argv);
3927
252b5132
RH
3928 strip_symbols = STRIP_UNDEF;
3929 discard_locals = LOCALS_UNDEF;
3930
3931 bfd_init ();
3932 set_default_bfd_target ();
3933
3934 if (is_strip < 0)
3935 {
3936 int i = strlen (program_name);
5af11cab
AM
3937#ifdef HAVE_DOS_BASED_FILE_SYSTEM
3938 /* Drop the .exe suffix, if any. */
3939 if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
3940 {
3941 i -= 4;
3942 program_name[i] = '\0';
3943 }
3944#endif
3945 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
252b5132
RH
3946 }
3947
047c9024
NC
3948 create_symbol_htabs ();
3949
252b5132
RH
3950 if (is_strip)
3951 strip_main (argc, argv);
3952 else
3953 copy_main (argc, argv);
3954
3955 END_PROGRESS (program_name);
3956
3957 return status;
3958}