* m32r.cpu (HASH-PREFIX): Delete.
[deliverable/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\
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
945 /* PR binutils/3166
946 Group sections look like debugging sections but they are not.
947 (They have a non-zero size but they are not ALLOCated). */
948 if (strip_symbols == STRIP_NONDEBUG)
949 return TRUE;
950
951 /* PR binutils/3181
952 If we are going to strip the group signature symbol, then
953 strip the group section too. */
954 gsym = group_signature (sec);
955 if (gsym != NULL)
956 gname = gsym->name;
957 else
958 gname = sec->name;
959 if ((strip_symbols == STRIP_ALL
047c9024
NC
960 && !is_specified_symbol (gname, keep_specific_htab))
961 || is_specified_symbol (gname, strip_specific_htab))
30288845
AM
962 return TRUE;
963 }
91bb255c 964
f0312d39 965 return FALSE;
252b5132
RH
966}
967
d58c2e3a
RS
968/* Return true if SYM is a hidden symbol. */
969
970static bfd_boolean
971is_hidden_symbol (asymbol *sym)
972{
973 elf_symbol_type *elf_sym;
974
975 elf_sym = elf_symbol_from (sym->the_bfd, sym);
976 if (elf_sym != NULL)
977 switch (ELF_ST_VISIBILITY (elf_sym->internal_elf_sym.st_other))
978 {
979 case STV_HIDDEN:
980 case STV_INTERNAL:
981 return TRUE;
982 }
983 return FALSE;
984}
985
252b5132
RH
986/* Choose which symbol entries to copy; put the result in OSYMS.
987 We don't copy in place, because that confuses the relocs.
988 Return the number of symbols to print. */
989
990static unsigned int
84e2f313
NC
991filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms,
992 asymbol **isyms, long symcount)
252b5132 993{
84e2f313 994 asymbol **from = isyms, **to = osyms;
252b5132 995 long src_count = 0, dst_count = 0;
e205a099 996 int relocatable = (abfd->flags & (EXEC_P | DYNAMIC)) == 0;
252b5132
RH
997
998 for (; src_count < symcount; src_count++)
999 {
1000 asymbol *sym = from[src_count];
1001 flagword flags = sym->flags;
d7fb0dd2 1002 char *name = (char *) bfd_asymbol_name (sym);
312aaa3c
NC
1003 bfd_boolean keep;
1004 bfd_boolean used_in_reloc = FALSE;
b34976b6 1005 bfd_boolean undefined;
d7fb0dd2
NC
1006 bfd_boolean rem_leading_char;
1007 bfd_boolean add_leading_char;
1008
1009 undefined = bfd_is_und_section (bfd_get_section (sym));
252b5132 1010
57938635
AM
1011 if (redefine_sym_list)
1012 {
d7fb0dd2 1013 char *old_name, *new_name;
57938635 1014
d7fb0dd2
NC
1015 old_name = (char *) bfd_asymbol_name (sym);
1016 new_name = (char *) lookup_sym_redefinition (old_name);
66491ebc
AM
1017 bfd_asymbol_name (sym) = new_name;
1018 name = new_name;
57938635
AM
1019 }
1020
d7fb0dd2
NC
1021 /* Check if we will remove the current leading character. */
1022 rem_leading_char =
1023 (name[0] == bfd_get_symbol_leading_char (abfd))
1024 && (change_leading_char
1025 || (remove_leading_char
1026 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1027 || undefined
1028 || bfd_is_com_section (bfd_get_section (sym)))));
1029
1030 /* Check if we will add a new leading character. */
1031 add_leading_char =
1032 change_leading_char
1033 && (bfd_get_symbol_leading_char (obfd) != '\0')
1034 && (bfd_get_symbol_leading_char (abfd) == '\0'
1035 || (name[0] == bfd_get_symbol_leading_char (abfd)));
1036
1037 /* Short circuit for change_leading_char if we can do it in-place. */
1038 if (rem_leading_char && add_leading_char && !prefix_symbols_string)
1039 {
1040 name[0] = bfd_get_symbol_leading_char (obfd);
1041 bfd_asymbol_name (sym) = name;
1042 rem_leading_char = FALSE;
1043 add_leading_char = FALSE;
1044 }
1045
1046 /* Remove leading char. */
1047 if (rem_leading_char)
66491ebc 1048 bfd_asymbol_name (sym) = ++name;
d7fb0dd2
NC
1049
1050 /* Add new leading char and/or prefix. */
1051 if (add_leading_char || prefix_symbols_string)
1052 {
1053 char *n, *ptr;
1054
3f5e193b
NC
1055 ptr = n = (char *) xmalloc (1 + strlen (prefix_symbols_string)
1056 + strlen (name) + 1);
d7fb0dd2
NC
1057 if (add_leading_char)
1058 *ptr++ = bfd_get_symbol_leading_char (obfd);
1059
1060 if (prefix_symbols_string)
1061 {
1062 strcpy (ptr, prefix_symbols_string);
1063 ptr += strlen (prefix_symbols_string);
1064 }
1065
1066 strcpy (ptr, name);
66491ebc
AM
1067 bfd_asymbol_name (sym) = n;
1068 name = n;
252b5132
RH
1069 }
1070
252b5132 1071 if (strip_symbols == STRIP_ALL)
312aaa3c 1072 keep = FALSE;
252b5132
RH
1073 else if ((flags & BSF_KEEP) != 0 /* Used in relocation. */
1074 || ((flags & BSF_SECTION_SYM) != 0
1075 && ((*bfd_get_section (sym)->symbol_ptr_ptr)->flags
1076 & BSF_KEEP) != 0))
312aaa3c
NC
1077 {
1078 keep = TRUE;
1079 used_in_reloc = TRUE;
1080 }
0af11b59 1081 else if (relocatable /* Relocatable file. */
0691f7af
L
1082 && ((flags & (BSF_GLOBAL | BSF_WEAK)) != 0
1083 || bfd_is_com_section (bfd_get_section (sym))))
312aaa3c 1084 keep = TRUE;
16b2b71c
NC
1085 else if (bfd_decode_symclass (sym) == 'I')
1086 /* Global symbols in $idata sections need to be retained
b34976b6 1087 even if relocatable is FALSE. External users of the
16b2b71c
NC
1088 library containing the $idata section may reference these
1089 symbols. */
312aaa3c 1090 keep = TRUE;
252b5132
RH
1091 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
1092 || (flags & BSF_WEAK) != 0
24e01a36 1093 || undefined
252b5132
RH
1094 || bfd_is_com_section (bfd_get_section (sym)))
1095 keep = strip_symbols != STRIP_UNNEEDED;
1096 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
1097 keep = (strip_symbols != STRIP_DEBUG
1098 && strip_symbols != STRIP_UNNEEDED
1099 && ! convert_debugging);
082b7297 1100 else if (bfd_coff_get_comdat_section (abfd, bfd_get_section (sym)))
af3bdff7
NC
1101 /* COMDAT sections store special information in local
1102 symbols, so we cannot risk stripping any of them. */
312aaa3c 1103 keep = TRUE;
252b5132
RH
1104 else /* Local symbol. */
1105 keep = (strip_symbols != STRIP_UNNEEDED
1106 && (discard_locals != LOCALS_ALL
1107 && (discard_locals != LOCALS_START_L
1108 || ! bfd_is_local_label (abfd, sym))));
1109
047c9024 1110 if (keep && is_specified_symbol (name, strip_specific_htab))
312aaa3c
NC
1111 {
1112 /* There are multiple ways to set 'keep' above, but if it
1113 was the relocatable symbol case, then that's an error. */
1114 if (used_in_reloc)
1115 {
1116 non_fatal (_("not stripping symbol `%s' because it is named in a relocation"), name);
1117 status = 1;
1118 }
1119 else
1120 keep = FALSE;
1121 }
1122
bcf32829
JB
1123 if (keep
1124 && !(flags & BSF_KEEP)
047c9024 1125 && is_specified_symbol (name, strip_unneeded_htab))
312aaa3c
NC
1126 keep = FALSE;
1127
1637cd90
JB
1128 if (!keep
1129 && ((keep_file_symbols && (flags & BSF_FILE))
047c9024 1130 || is_specified_symbol (name, keep_specific_htab)))
312aaa3c
NC
1131 keep = TRUE;
1132
252b5132 1133 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
312aaa3c 1134 keep = FALSE;
e0c60db2 1135
7b4a0685 1136 if (keep)
252b5132 1137 {
7b4a0685 1138 if ((flags & BSF_GLOBAL) != 0
047c9024 1139 && (weaken || is_specified_symbol (name, weaken_specific_htab)))
7b4a0685
NC
1140 {
1141 sym->flags &= ~ BSF_GLOBAL;
1142 sym->flags |= BSF_WEAK;
1143 }
252b5132 1144
7b4a0685
NC
1145 if (!undefined
1146 && (flags & (BSF_GLOBAL | BSF_WEAK))
047c9024
NC
1147 && (is_specified_symbol (name, localize_specific_htab)
1148 || (htab_elements (keepglobal_specific_htab) != 0
1149 && ! is_specified_symbol (name, keepglobal_specific_htab))
d58c2e3a 1150 || (localize_hidden && is_hidden_symbol (sym))))
7b4a0685
NC
1151 {
1152 sym->flags &= ~ (BSF_GLOBAL | BSF_WEAK);
1153 sym->flags |= BSF_LOCAL;
1154 }
1155
1156 if (!undefined
c1c0eb9e 1157 && (flags & BSF_LOCAL)
047c9024 1158 && is_specified_symbol (name, globalize_specific_htab))
7b4a0685
NC
1159 {
1160 sym->flags &= ~ BSF_LOCAL;
1161 sym->flags |= BSF_GLOBAL;
1162 }
1163
1164 to[dst_count++] = sym;
1165 }
252b5132
RH
1166 }
1167
1168 to[dst_count] = NULL;
1169
1170 return dst_count;
1171}
1172
594ef5db
NC
1173/* Find the redefined name of symbol SOURCE. */
1174
57938635 1175static const char *
84e2f313 1176lookup_sym_redefinition (const char *source)
57938635 1177{
57938635
AM
1178 struct redefine_node *list;
1179
57938635 1180 for (list = redefine_sym_list; list != NULL; list = list->next)
594ef5db
NC
1181 if (strcmp (source, list->source) == 0)
1182 return list->target;
1183
1184 return source;
57938635
AM
1185}
1186
594ef5db 1187/* Add a node to a symbol redefine list. */
57938635
AM
1188
1189static void
84e2f313 1190redefine_list_append (const char *cause, const char *source, const char *target)
57938635
AM
1191{
1192 struct redefine_node **p;
1193 struct redefine_node *list;
1194 struct redefine_node *new_node;
1195
1196 for (p = &redefine_sym_list; (list = *p) != NULL; p = &list->next)
1197 {
1198 if (strcmp (source, list->source) == 0)
594ef5db 1199 fatal (_("%s: Multiple redefinition of symbol \"%s\""),
92991082 1200 cause, source);
57938635
AM
1201
1202 if (strcmp (target, list->target) == 0)
594ef5db 1203 fatal (_("%s: Symbol \"%s\" is target of more than one redefinition"),
92991082 1204 cause, target);
57938635
AM
1205 }
1206
3f5e193b 1207 new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node));
57938635
AM
1208
1209 new_node->source = strdup (source);
1210 new_node->target = strdup (target);
1211 new_node->next = NULL;
1212
1213 *p = new_node;
1214}
1215
92991082
JT
1216/* Handle the --redefine-syms option. Read lines containing "old new"
1217 from the file, and add them to the symbol redefine list. */
1218
2593f09a 1219static void
84e2f313 1220add_redefine_syms_file (const char *filename)
92991082
JT
1221{
1222 FILE *file;
1223 char *buf;
84e2f313
NC
1224 size_t bufsize;
1225 size_t len;
1226 size_t outsym_off;
92991082
JT
1227 int c, lineno;
1228
1229 file = fopen (filename, "r");
d3ba0551 1230 if (file == NULL)
92991082
JT
1231 fatal (_("couldn't open symbol redefinition file %s (error: %s)"),
1232 filename, strerror (errno));
1233
1234 bufsize = 100;
a6da20b5 1235 buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */);
92991082
JT
1236
1237 lineno = 1;
1238 c = getc (file);
1239 len = 0;
1240 outsym_off = 0;
1241 while (c != EOF)
1242 {
1243 /* Collect the input symbol name. */
1244 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1245 {
1246 if (c == '#')
1247 goto comment;
1248 buf[len++] = c;
1249 if (len >= bufsize)
1250 {
1251 bufsize *= 2;
a6da20b5 1252 buf = (char *) xrealloc (buf, bufsize + 1);
92991082
JT
1253 }
1254 c = getc (file);
1255 }
1256 buf[len++] = '\0';
1257 if (c == EOF)
1258 break;
1259
1260 /* Eat white space between the symbol names. */
1261 while (IS_WHITESPACE (c))
1262 c = getc (file);
1263 if (c == '#' || IS_LINE_TERMINATOR (c))
1264 goto comment;
1265 if (c == EOF)
1266 break;
1267
1268 /* Collect the output symbol name. */
1269 outsym_off = len;
1270 while (! IS_WHITESPACE (c) && ! IS_LINE_TERMINATOR (c) && c != EOF)
1271 {
1272 if (c == '#')
1273 goto comment;
1274 buf[len++] = c;
1275 if (len >= bufsize)
1276 {
1277 bufsize *= 2;
a6da20b5 1278 buf = (char *) xrealloc (buf, bufsize + 1);
92991082
JT
1279 }
1280 c = getc (file);
1281 }
1282 buf[len++] = '\0';
1283 if (c == EOF)
1284 break;
1285
1286 /* Eat white space at end of line. */
1287 while (! IS_LINE_TERMINATOR(c) && c != EOF && IS_WHITESPACE (c))
1288 c = getc (file);
1289 if (c == '#')
1290 goto comment;
1291 /* Handle \r\n. */
1292 if ((c == '\r' && (c = getc (file)) == '\n')
1293 || c == '\n' || c == EOF)
1294 {
1295 end_of_line:
1296 /* Append the redefinition to the list. */
1297 if (buf[0] != '\0')
1298 redefine_list_append (filename, &buf[0], &buf[outsym_off]);
1299
c1c0eb9e 1300 lineno++;
92991082
JT
1301 len = 0;
1302 outsym_off = 0;
1303 if (c == EOF)
1304 break;
1305 c = getc (file);
1306 continue;
1307 }
1308 else
d412a550 1309 fatal (_("%s:%d: garbage found at end of line"), filename, lineno);
92991082
JT
1310 comment:
1311 if (len != 0 && (outsym_off == 0 || outsym_off == len))
d412a550 1312 fatal (_("%s:%d: missing new symbol name"), filename, lineno);
92991082
JT
1313 buf[len++] = '\0';
1314
1315 /* Eat the rest of the line and finish it. */
1316 while (c != '\n' && c != EOF)
1317 c = getc (file);
1318 goto end_of_line;
1319 }
1320
1321 if (len != 0)
d412a550 1322 fatal (_("%s:%d: premature end of file"), filename, lineno);
92991082
JT
1323
1324 free (buf);
1325}
1326
77f762d6
L
1327/* Copy unkown object file IBFD onto OBFD.
1328 Returns TRUE upon success, FALSE otherwise. */
1329
1330static bfd_boolean
1331copy_unknown_object (bfd *ibfd, bfd *obfd)
1332{
1333 char *cbuf;
1334 int tocopy;
1335 long ncopied;
1336 long size;
1337 struct stat buf;
1338
1339 if (bfd_stat_arch_elt (ibfd, &buf) != 0)
1340 {
8d8e0703 1341 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
77f762d6
L
1342 return FALSE;
1343 }
1344
1345 size = buf.st_size;
1346 if (size < 0)
1347 {
1348 non_fatal (_("stat returns negative size for `%s'"),
1349 bfd_get_archive_filename (ibfd));
1350 return FALSE;
1351 }
1352
1353 if (bfd_seek (ibfd, (file_ptr) 0, SEEK_SET) != 0)
1354 {
1355 bfd_nonfatal (bfd_get_archive_filename (ibfd));
1356 return FALSE;
1357 }
1358
1359 if (verbose)
1360 printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"),
1361 bfd_get_archive_filename (ibfd), bfd_get_filename (obfd));
1362
3f5e193b 1363 cbuf = (char *) xmalloc (BUFSIZE);
77f762d6
L
1364 ncopied = 0;
1365 while (ncopied < size)
1366 {
1367 tocopy = size - ncopied;
1368 if (tocopy > BUFSIZE)
1369 tocopy = BUFSIZE;
1370
1371 if (bfd_bread (cbuf, (bfd_size_type) tocopy, ibfd)
1372 != (bfd_size_type) tocopy)
1373 {
8d8e0703 1374 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
77f762d6
L
1375 free (cbuf);
1376 return FALSE;
1377 }
1378
1379 if (bfd_bwrite (cbuf, (bfd_size_type) tocopy, obfd)
1380 != (bfd_size_type) tocopy)
1381 {
2db6cde7 1382 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
77f762d6
L
1383 free (cbuf);
1384 return FALSE;
1385 }
1386
1387 ncopied += tocopy;
1388 }
1389
1390 chmod (bfd_get_filename (obfd), buf.st_mode);
1391 free (cbuf);
1392 return TRUE;
1393}
1394
950d48e7 1395/* Copy object file IBFD onto OBFD.
5b8c74e6 1396 Returns TRUE upon success, FALSE otherwise. */
252b5132 1397
950d48e7 1398static bfd_boolean
8b31b6c4 1399copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch)
252b5132
RH
1400{
1401 bfd_vma start;
1402 long symcount;
1403 asection **osections = NULL;
84e2f313 1404 asection *gnu_debuglink_section = NULL;
252b5132
RH
1405 bfd_size_type *gaps = NULL;
1406 bfd_size_type max_gap = 0;
1407 long symsize;
84e2f313 1408 void *dhandle;
66491ebc
AM
1409 enum bfd_architecture iarch;
1410 unsigned int imach;
252b5132 1411
23719f39
NC
1412 if (ibfd->xvec->byteorder != obfd->xvec->byteorder
1413 && ibfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN
1414 && obfd->xvec->byteorder != BFD_ENDIAN_UNKNOWN)
950d48e7 1415 fatal (_("Unable to change endianness of input file(s)"));
252b5132
RH
1416
1417 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
950d48e7 1418 {
2db6cde7 1419 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
950d48e7
NC
1420 return FALSE;
1421 }
252b5132
RH
1422
1423 if (verbose)
77f762d6
L
1424 printf (_("copy from `%s' [%s] to `%s' [%s]\n"),
1425 bfd_get_archive_filename (ibfd), bfd_get_target (ibfd),
252b5132
RH
1426 bfd_get_filename (obfd), bfd_get_target (obfd));
1427
d3e52d40
RS
1428 if (extract_symbol)
1429 start = 0;
252b5132 1430 else
d3e52d40
RS
1431 {
1432 if (set_start_set)
1433 start = set_start;
1434 else
1435 start = bfd_get_start_address (ibfd);
1436 start += change_start;
1437 }
252b5132 1438
0af11b59
KH
1439 /* Neither the start address nor the flags
1440 need to be set for a core file. */
4dd67f29
MS
1441 if (bfd_get_format (obfd) != bfd_core)
1442 {
4087920c
MR
1443 flagword flags;
1444
1445 flags = bfd_get_file_flags (ibfd);
1446 flags |= bfd_flags_to_set;
1447 flags &= ~bfd_flags_to_clear;
1448 flags &= bfd_applicable_file_flags (obfd);
1449
3516e984
L
1450 if (strip_symbols == STRIP_ALL)
1451 flags &= ~HAS_RELOC;
1452
4dd67f29 1453 if (!bfd_set_start_address (obfd, start)
4087920c 1454 || !bfd_set_file_flags (obfd, flags))
950d48e7 1455 {
8d8e0703 1456 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
950d48e7
NC
1457 return FALSE;
1458 }
4dd67f29 1459 }
252b5132 1460
594ef5db 1461 /* Copy architecture of input file to output file. */
66491ebc
AM
1462 iarch = bfd_get_arch (ibfd);
1463 imach = bfd_get_mach (ibfd);
8b31b6c4
NC
1464 if (input_arch)
1465 {
1466 if (bfd_get_arch_info (ibfd) == NULL
1467 || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown)
1468 {
1469 iarch = input_arch->arch;
1470 imach = input_arch->mach;
1471 }
1472 else
1473 non_fatal (_("Input file `%s' ignores binary architecture parameter."),
1474 bfd_get_archive_filename (ibfd));
1475 }
66491ebc 1476 if (!bfd_set_arch_mach (obfd, iarch, imach)
212a3c4d
L
1477 && (ibfd->target_defaulted
1478 || bfd_get_arch (ibfd) != bfd_get_arch (obfd)))
f57a841a
NC
1479 {
1480 if (bfd_get_arch (ibfd) == bfd_arch_unknown)
77f762d6
L
1481 non_fatal (_("Unable to recognise the format of the input file `%s'"),
1482 bfd_get_archive_filename (ibfd));
f57a841a 1483 else
c1e2cb9d 1484 non_fatal (_("Output file cannot represent architecture `%s'"),
77f762d6
L
1485 bfd_printable_arch_mach (bfd_get_arch (ibfd),
1486 bfd_get_mach (ibfd)));
1487 return FALSE;
f57a841a 1488 }
57938635 1489
252b5132 1490 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
950d48e7 1491 {
8d8e0703 1492 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
950d48e7
NC
1493 return FALSE;
1494 }
252b5132 1495
92dd4511
L
1496 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
1497 && bfd_pei_p (obfd))
1498 {
1499 /* Set up PE parameters. */
1500 pe_data_type *pe = pe_data (obfd);
1501
325c681d
L
1502 /* Copy PE parameters before changing them. */
1503 if (ibfd->xvec->flavour == bfd_target_coff_flavour
1504 && bfd_pei_p (ibfd))
1505 pe->pe_opthdr = pe_data (ibfd)->pe_opthdr;
1506
92dd4511
L
1507 if (pe_file_alignment != (bfd_vma) -1)
1508 pe->pe_opthdr.FileAlignment = pe_file_alignment;
1509 else
1510 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
1511
1512 if (pe_heap_commit != (bfd_vma) -1)
1513 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_commit;
1514
1515 if (pe_heap_reserve != (bfd_vma) -1)
1516 pe->pe_opthdr.SizeOfHeapCommit = pe_heap_reserve;
1517
1518 if (pe_image_base != (bfd_vma) -1)
1519 pe->pe_opthdr.ImageBase = pe_image_base;
1520
1521 if (pe_section_alignment != (bfd_vma) -1)
1522 pe->pe_opthdr.SectionAlignment = pe_section_alignment;
1523 else
1524 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
1525
1526 if (pe_stack_commit != (bfd_vma) -1)
1527 pe->pe_opthdr.SizeOfStackCommit = pe_stack_commit;
1528
1529 if (pe_stack_reserve != (bfd_vma) -1)
1530 pe->pe_opthdr.SizeOfStackCommit = pe_stack_reserve;
1531
1532 if (pe_subsystem != -1)
1533 pe->pe_opthdr.Subsystem = pe_subsystem;
1534
1535 if (pe_major_subsystem_version != -1)
1536 pe->pe_opthdr.MajorSubsystemVersion = pe_major_subsystem_version;
1537
1538 if (pe_minor_subsystem_version != -1)
1539 pe->pe_opthdr.MinorSubsystemVersion = pe_minor_subsystem_version;
1540
1541 if (pe_file_alignment > pe_section_alignment)
1542 {
1543 char file_alignment[20], section_alignment[20];
1544
1545 sprintf_vma (file_alignment, pe_file_alignment);
1546 sprintf_vma (section_alignment, pe_section_alignment);
1547 non_fatal (_("warning: file alignment (0x%s) > section alignment (0x%s)"),
1548
1549 file_alignment, section_alignment);
1550 }
1551 }
1552
252b5132 1553 if (isympp)
62d732f5 1554 free (isympp);
57938635 1555
252b5132 1556 if (osympp != isympp)
62d732f5
AM
1557 free (osympp);
1558
1559 isympp = NULL;
1560 osympp = NULL;
252b5132 1561
c39ada54
AM
1562 symsize = bfd_get_symtab_upper_bound (ibfd);
1563 if (symsize < 0)
1564 {
8d8e0703 1565 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
c39ada54
AM
1566 return FALSE;
1567 }
1568
3f5e193b 1569 osympp = isympp = (asymbol **) xmalloc (symsize);
c39ada54
AM
1570 symcount = bfd_canonicalize_symtab (ibfd, isympp);
1571 if (symcount < 0)
1572 {
2db6cde7 1573 bfd_nonfatal_message (NULL, ibfd, NULL, NULL);
c39ada54
AM
1574 return FALSE;
1575 }
1576
252b5132
RH
1577 /* BFD mandates that all output sections be created and sizes set before
1578 any output is done. Thus, we traverse all sections multiple times. */
d3ba0551 1579 bfd_map_over_sections (ibfd, setup_section, obfd);
252b5132 1580
237dcb53
AM
1581 if (!extract_symbol)
1582 setup_bfd_headers (ibfd, obfd);
80fccad2 1583
252b5132
RH
1584 if (add_sections != NULL)
1585 {
1586 struct section_add *padd;
1587 struct section_list *pset;
1588
1589 for (padd = add_sections; padd != NULL; padd = padd->next)
1590 {
2593f09a
NC
1591 flagword flags;
1592
551b43fd
AM
1593 pset = find_section_list (padd->name, FALSE);
1594 if (pset != NULL)
1595 pset->used = TRUE;
1596
1597 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
1598 if (pset != NULL && pset->set_flags)
1599 flags = pset->flags | SEC_HAS_CONTENTS;
1600
c8782eee
NC
1601 /* bfd_make_section_with_flags() does not return very helpful
1602 error codes, so check for the most likely user error first. */
1603 if (bfd_get_section_by_name (obfd, padd->name))
252b5132 1604 {
2db6cde7
NS
1605 bfd_nonfatal_message (NULL, obfd, NULL,
1606 _("can't add section '%s'"), padd->name);
950d48e7 1607 return FALSE;
252b5132 1608 }
c8782eee
NC
1609 else
1610 {
0930eddd
NS
1611 /* We use LINKER_CREATED here so that the backend hooks
1612 will create any special section type information,
1613 instead of presuming we know what we're doing merely
1614 because we set the flags. */
1615 padd->section = bfd_make_section_with_flags
1616 (obfd, padd->name, flags | SEC_LINKER_CREATED);
c8782eee
NC
1617 if (padd->section == NULL)
1618 {
2db6cde7
NS
1619 bfd_nonfatal_message (NULL, obfd, NULL,
1620 _("can't create section `%s'"),
1621 padd->name);
c8782eee
NC
1622 return FALSE;
1623 }
1624 }
252b5132 1625
2593f09a 1626 if (! bfd_set_section_size (obfd, padd->section, padd->size))
950d48e7 1627 {
2db6cde7 1628 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
950d48e7
NC
1629 return FALSE;
1630 }
252b5132 1631
2593f09a
NC
1632 if (pset != NULL)
1633 {
1634 if (pset->change_vma != CHANGE_IGNORE)
84e2f313
NC
1635 if (! bfd_set_section_vma (obfd, padd->section,
1636 pset->vma_val))
950d48e7 1637 {
2db6cde7 1638 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
950d48e7
NC
1639 return FALSE;
1640 }
57938635 1641
2593f09a
NC
1642 if (pset->change_lma != CHANGE_IGNORE)
1643 {
1644 padd->section->lma = pset->lma_val;
950d48e7 1645
2593f09a
NC
1646 if (! bfd_set_section_alignment
1647 (obfd, padd->section,
1648 bfd_section_alignment (obfd, padd->section)))
950d48e7 1649 {
2db6cde7 1650 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
950d48e7
NC
1651 return FALSE;
1652 }
252b5132
RH
1653 }
1654 }
1655 }
1656 }
1657
2593f09a
NC
1658 if (gnu_debuglink_filename != NULL)
1659 {
84e2f313
NC
1660 gnu_debuglink_section = bfd_create_gnu_debuglink_section
1661 (obfd, gnu_debuglink_filename);
e7c81c25
NC
1662
1663 if (gnu_debuglink_section == NULL)
950d48e7 1664 {
2db6cde7
NS
1665 bfd_nonfatal_message (NULL, obfd, NULL,
1666 _("cannot create debug link section `%s'"),
1667 gnu_debuglink_filename);
950d48e7
NC
1668 return FALSE;
1669 }
6e2c86ac
NC
1670
1671 /* Special processing for PE format files. We
1672 have no way to distinguish PE from COFF here. */
1673 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour)
1674 {
1675 bfd_vma debuglink_vma;
1676 asection * highest_section;
1677 asection * sec;
1678
1679 /* The PE spec requires that all sections be adjacent and sorted
1680 in ascending order of VMA. It also specifies that debug
1681 sections should be last. This is despite the fact that debug
1682 sections are not loaded into memory and so in theory have no
1683 use for a VMA.
1684
1685 This means that the debuglink section must be given a non-zero
1686 VMA which makes it contiguous with other debug sections. So
1687 walk the current section list, find the section with the
1688 highest VMA and start the debuglink section after that one. */
1689 for (sec = obfd->sections, highest_section = NULL;
1690 sec != NULL;
1691 sec = sec->next)
1692 if (sec->vma > 0
1693 && (highest_section == NULL
1694 || sec->vma > highest_section->vma))
1695 highest_section = sec;
1696
1697 if (highest_section)
1698 debuglink_vma = BFD_ALIGN (highest_section->vma
1699 + highest_section->size,
1700 /* FIXME: We ought to be using
1701 COFF_PAGE_SIZE here or maybe
1702 bfd_get_section_alignment() (if it
1703 was set) but since this is for PE
1704 and we know the required alignment
1705 it is easier just to hard code it. */
1706 0x1000);
1707 else
1708 /* Umm, not sure what to do in this case. */
1709 debuglink_vma = 0x1000;
1710
1711 bfd_set_section_vma (obfd, gnu_debuglink_section, debuglink_vma);
1712 }
950d48e7
NC
1713 }
1714
1aa9ef63
L
1715 if (bfd_count_sections (obfd) != 0
1716 && (gap_fill_set || pad_to_set))
252b5132
RH
1717 {
1718 asection **set;
1719 unsigned int c, i;
1720
1721 /* We must fill in gaps between the sections and/or we must pad
1722 the last section to a specified address. We do this by
1723 grabbing a list of the sections, sorting them by VMA, and
1724 increasing the section sizes as required to fill the gaps.
1725 We write out the gap contents below. */
1726
1727 c = bfd_count_sections (obfd);
3f5e193b 1728 osections = (asection **) xmalloc (c * sizeof (asection *));
252b5132 1729 set = osections;
d3ba0551 1730 bfd_map_over_sections (obfd, get_sections, &set);
252b5132
RH
1731
1732 qsort (osections, c, sizeof (asection *), compare_section_lma);
1733
3f5e193b 1734 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
252b5132
RH
1735 memset (gaps, 0, c * sizeof (bfd_size_type));
1736
1737 if (gap_fill_set)
1738 {
1739 for (i = 0; i < c - 1; i++)
1740 {
1741 flagword flags;
1742 bfd_size_type size;
1743 bfd_vma gap_start, gap_stop;
1744
1745 flags = bfd_get_section_flags (obfd, osections[i]);
1746 if ((flags & SEC_HAS_CONTENTS) == 0
1747 || (flags & SEC_LOAD) == 0)
1748 continue;
1749
1750 size = bfd_section_size (obfd, osections[i]);
1751 gap_start = bfd_section_lma (obfd, osections[i]) + size;
1752 gap_stop = bfd_section_lma (obfd, osections[i + 1]);
1753 if (gap_start < gap_stop)
1754 {
1755 if (! bfd_set_section_size (obfd, osections[i],
1756 size + (gap_stop - gap_start)))
1757 {
2db6cde7
NS
1758 bfd_nonfatal_message (NULL, obfd, osections[i],
1759 _("Can't fill gap after section"));
252b5132
RH
1760 status = 1;
1761 break;
1762 }
1763 gaps[i] = gap_stop - gap_start;
1764 if (max_gap < gap_stop - gap_start)
1765 max_gap = gap_stop - gap_start;
1766 }
1767 }
1768 }
1769
1770 if (pad_to_set)
1771 {
1772 bfd_vma lma;
1773 bfd_size_type size;
1774
1775 lma = bfd_section_lma (obfd, osections[c - 1]);
1776 size = bfd_section_size (obfd, osections[c - 1]);
1777 if (lma + size < pad_to)
1778 {
1779 if (! bfd_set_section_size (obfd, osections[c - 1],
1780 pad_to - lma))
1781 {
2db6cde7
NS
1782 bfd_nonfatal_message (NULL, obfd, osections[c - 1],
1783 _("can't add padding"));
252b5132
RH
1784 status = 1;
1785 }
1786 else
1787 {
1788 gaps[c - 1] = pad_to - (lma + size);
1789 if (max_gap < pad_to - (lma + size))
1790 max_gap = pad_to - (lma + size);
1791 }
1792 }
1793 }
1794 }
1795
594ef5db
NC
1796 /* Symbol filtering must happen after the output sections
1797 have been created, but before their contents are set. */
252b5132 1798 dhandle = NULL;
252b5132 1799 if (convert_debugging)
b922d590 1800 dhandle = read_debugging_info (ibfd, isympp, symcount, FALSE);
57938635
AM
1801
1802 if (strip_symbols == STRIP_DEBUG
252b5132
RH
1803 || strip_symbols == STRIP_ALL
1804 || strip_symbols == STRIP_UNNEEDED
ed1653a7 1805 || strip_symbols == STRIP_NONDEBUG
252b5132 1806 || discard_locals != LOCALS_UNDEF
d58c2e3a 1807 || localize_hidden
047c9024
NC
1808 || htab_elements (strip_specific_htab) != 0
1809 || htab_elements (keep_specific_htab) != 0
1810 || htab_elements (localize_specific_htab) != 0
1811 || htab_elements (globalize_specific_htab) != 0
1812 || htab_elements (keepglobal_specific_htab) != 0
1813 || htab_elements (weaken_specific_htab) != 0
d7fb0dd2 1814 || prefix_symbols_string
252b5132 1815 || sections_removed
f91ea849 1816 || sections_copied
252b5132
RH
1817 || convert_debugging
1818 || change_leading_char
1819 || remove_leading_char
57938635 1820 || redefine_sym_list
252b5132
RH
1821 || weaken)
1822 {
1823 /* Mark symbols used in output relocations so that they
1824 are kept, even if they are local labels or static symbols.
57938635 1825
252b5132
RH
1826 Note we iterate over the input sections examining their
1827 relocations since the relocations for the output sections
1828 haven't been set yet. mark_symbols_used_in_relocations will
1829 ignore input sections which have no corresponding output
1830 section. */
1831 if (strip_symbols != STRIP_ALL)
1832 bfd_map_over_sections (ibfd,
1833 mark_symbols_used_in_relocations,
d3ba0551 1834 isympp);
3f5e193b 1835 osympp = (asymbol **) xmalloc ((symcount + 1) * sizeof (asymbol *));
252b5132
RH
1836 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
1837 }
1838
1839 if (convert_debugging && dhandle != NULL)
1840 {
1841 if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
1842 {
1843 status = 1;
950d48e7 1844 return FALSE;
252b5132
RH
1845 }
1846 }
1847
1848 bfd_set_symtab (obfd, osympp, symcount);
1849
1850 /* This has to happen after the symbol table has been set. */
d3ba0551 1851 bfd_map_over_sections (ibfd, copy_section, obfd);
252b5132
RH
1852
1853 if (add_sections != NULL)
1854 {
1855 struct section_add *padd;
1856
1857 for (padd = add_sections; padd != NULL; padd = padd->next)
1858 {
d3ba0551
AM
1859 if (! bfd_set_section_contents (obfd, padd->section, padd->contents,
1860 0, padd->size))
950d48e7 1861 {
2db6cde7 1862 bfd_nonfatal_message (NULL, obfd, padd->section, NULL);
950d48e7
NC
1863 return FALSE;
1864 }
252b5132
RH
1865 }
1866 }
1867
e7c81c25
NC
1868 if (gnu_debuglink_filename != NULL)
1869 {
1870 if (! bfd_fill_in_gnu_debuglink_section
1871 (obfd, gnu_debuglink_section, gnu_debuglink_filename))
950d48e7 1872 {
2db6cde7
NS
1873 bfd_nonfatal_message (NULL, obfd, NULL,
1874 _("cannot fill debug link section `%s'"),
1875 gnu_debuglink_filename);
950d48e7
NC
1876 return FALSE;
1877 }
e7c81c25
NC
1878 }
1879
252b5132
RH
1880 if (gap_fill_set || pad_to_set)
1881 {
1882 bfd_byte *buf;
1883 int c, i;
1884
1885 /* Fill in the gaps. */
252b5132
RH
1886 if (max_gap > 8192)
1887 max_gap = 8192;
3f5e193b 1888 buf = (bfd_byte *) xmalloc (max_gap);
d3ba0551 1889 memset (buf, gap_fill, max_gap);
252b5132
RH
1890
1891 c = bfd_count_sections (obfd);
1892 for (i = 0; i < c; i++)
1893 {
1894 if (gaps[i] != 0)
1895 {
1896 bfd_size_type left;
1897 file_ptr off;
1898
1899 left = gaps[i];
1900 off = bfd_section_size (obfd, osections[i]) - left;
594ef5db 1901
252b5132
RH
1902 while (left > 0)
1903 {
1904 bfd_size_type now;
1905
1906 if (left > 8192)
1907 now = 8192;
1908 else
1909 now = left;
1910
1911 if (! bfd_set_section_contents (obfd, osections[i], buf,
1912 off, now))
950d48e7 1913 {
2db6cde7 1914 bfd_nonfatal_message (NULL, obfd, osections[i], NULL);
950d48e7
NC
1915 return FALSE;
1916 }
252b5132
RH
1917
1918 left -= now;
1919 off += now;
1920 }
1921 }
1922 }
1923 }
1924
d3e52d40
RS
1925 /* Do not copy backend data if --extract-symbol is passed; anything
1926 that needs to look at the section contents will fail. */
1927 if (extract_symbol)
1928 return TRUE;
1929
252b5132
RH
1930 /* Allow the BFD backend to copy any private data it understands
1931 from the input BFD to the output BFD. This is done last to
1932 permit the routine to look at the filtered symbol table, which is
1933 important for the ECOFF code at least. */
42bb2e33 1934 if (! bfd_copy_private_bfd_data (ibfd, obfd))
252b5132 1935 {
2db6cde7
NS
1936 bfd_nonfatal_message (NULL, obfd, NULL,
1937 _("error copying private BFD data"));
950d48e7 1938 return FALSE;
252b5132 1939 }
1ae8b3d2
AO
1940
1941 /* Switch to the alternate machine code. We have to do this at the
1942 very end, because we only initialize the header when we create
1943 the first section. */
f9d4ad2a
NC
1944 if (use_alt_mach_code != 0)
1945 {
1946 if (! bfd_alt_mach_code (obfd, use_alt_mach_code))
1947 {
1948 non_fatal (_("this target does not support %lu alternative machine codes"),
1949 use_alt_mach_code);
1950 if (bfd_get_flavour (obfd) == bfd_target_elf_flavour)
1951 {
1952 non_fatal (_("treating that number as an absolute e_machine value instead"));
1953 elf_elfheader (obfd)->e_machine = use_alt_mach_code;
1954 }
1955 else
1956 non_fatal (_("ignoring the alternative value"));
1957 }
1958 }
950d48e7
NC
1959
1960 return TRUE;
252b5132
RH
1961}
1962
1963/* Read each archive element in turn from IBFD, copy the
ee873e00
NC
1964 contents to temp file, and keep the temp file handle.
1965 If 'force_output_target' is TRUE then make sure that
1966 all elements in the new archive are of the type
1967 'output_target'. */
252b5132
RH
1968
1969static void
ee873e00 1970copy_archive (bfd *ibfd, bfd *obfd, const char *output_target,
8b31b6c4
NC
1971 bfd_boolean force_output_target,
1972 const bfd_arch_info_type *input_arch)
252b5132
RH
1973{
1974 struct name_list
1975 {
1976 struct name_list *next;
4c168fa3 1977 const char *name;
252b5132
RH
1978 bfd *obfd;
1979 } *list, *l;
1980 bfd **ptr = &obfd->archive_head;
1981 bfd *this_element;
8d8e0703
AM
1982 char *dir;
1983 const char *filename;
252b5132
RH
1984
1985 /* Make a temp directory to hold the contents. */
f9c026a8 1986 dir = make_tempdir (bfd_get_filename (obfd));
f9c026a8
NC
1987 if (dir == NULL)
1988 fatal (_("cannot create tempdir for archive copying (error: %s)"),
1989 strerror (errno));
84e2f313 1990
252b5132 1991 obfd->has_armap = ibfd->has_armap;
a8da6403 1992 obfd->is_thin_archive = ibfd->is_thin_archive;
252b5132
RH
1993
1994 list = NULL;
1995
1996 this_element = bfd_openr_next_archived_file (ibfd, NULL);
594ef5db 1997
b667df2e 1998 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
8d8e0703
AM
1999 {
2000 status = 1;
2001 bfd_nonfatal_message (NULL, obfd, NULL, NULL);
2002 return;
2003 }
b667df2e 2004
d3ba0551 2005 while (!status && this_element != NULL)
252b5132 2006 {
4c168fa3
AM
2007 char *output_name;
2008 bfd *output_bfd;
252b5132 2009 bfd *last_element;
8066d1a2
AS
2010 struct stat buf;
2011 int stat_status = 0;
3f5e193b 2012 bfd_boolean del = TRUE;
8066d1a2 2013
4c168fa3
AM
2014 /* Create an output file for this member. */
2015 output_name = concat (dir, "/",
2016 bfd_get_filename (this_element), (char *) 0);
2017
2018 /* If the file already exists, make another temp dir. */
2019 if (stat (output_name, &buf) >= 0)
2020 {
f9c026a8
NC
2021 output_name = make_tempdir (output_name);
2022 if (output_name == NULL)
485be063
AM
2023 fatal (_("cannot create tempdir for archive copying (error: %s)"),
2024 strerror (errno));
84e2f313 2025
3f5e193b 2026 l = (struct name_list *) xmalloc (sizeof (struct name_list));
4c168fa3
AM
2027 l->name = output_name;
2028 l->next = list;
2029 l->obfd = NULL;
2030 list = l;
2031 output_name = concat (output_name, "/",
2032 bfd_get_filename (this_element), (char *) 0);
2033 }
2034
8066d1a2
AS
2035 if (preserve_dates)
2036 {
2037 stat_status = bfd_stat_arch_elt (this_element, &buf);
594ef5db 2038
8066d1a2
AS
2039 if (stat_status != 0)
2040 non_fatal (_("internal stat error on %s"),
2041 bfd_get_filename (this_element));
2042 }
252b5132 2043
3f5e193b 2044 l = (struct name_list *) xmalloc (sizeof (struct name_list));
252b5132
RH
2045 l->name = output_name;
2046 l->next = list;
bee59fd2 2047 l->obfd = NULL;
252b5132
RH
2048 list = l;
2049
b34976b6 2050 if (bfd_check_format (this_element, bfd_object))
77f762d6 2051 {
ee873e00
NC
2052 /* PR binutils/3110: Cope with archives
2053 containing multiple target types. */
2054 if (force_output_target)
2055 output_bfd = bfd_openw (output_name, output_target);
2056 else
2057 output_bfd = bfd_openw (output_name, bfd_get_target (this_element));
2058
2059 if (output_bfd == NULL)
2db6cde7
NS
2060 {
2061 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
2062 status = 1;
2063 return;
2064 }
ee873e00 2065
8b31b6c4 2066 del = ! copy_object (this_element, output_bfd, input_arch);
252b5132 2067
3f5e193b 2068 if (! del
77f762d6
L
2069 || bfd_get_arch (this_element) != bfd_arch_unknown)
2070 {
2071 if (!bfd_close (output_bfd))
2072 {
8d8e0703 2073 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
77f762d6
L
2074 /* Error in new object file. Don't change archive. */
2075 status = 1;
2076 }
2077 }
2078 else
2079 goto copy_unknown_element;
2080 }
2081 else
252b5132 2082 {
8d8e0703 2083 bfd_nonfatal_message (NULL, this_element, NULL,
2db6cde7 2084 _("Unable to recognise the format of file"));
77f762d6 2085
ee873e00 2086 output_bfd = bfd_openw (output_name, output_target);
77f762d6 2087copy_unknown_element:
3f5e193b 2088 del = !copy_unknown_object (this_element, output_bfd);
77f762d6
L
2089 if (!bfd_close_all_done (output_bfd))
2090 {
8d8e0703 2091 bfd_nonfatal_message (output_name, NULL, NULL, NULL);
77f762d6
L
2092 /* Error in new object file. Don't change archive. */
2093 status = 1;
2094 }
252b5132
RH
2095 }
2096
3f5e193b 2097 if (del)
950d48e7
NC
2098 {
2099 unlink (output_name);
2100 status = 1;
2101 }
2102 else
2103 {
2104 if (preserve_dates && stat_status == 0)
2105 set_times (output_name, &buf);
8066d1a2 2106
950d48e7
NC
2107 /* Open the newly output file and attach to our list. */
2108 output_bfd = bfd_openr (output_name, output_target);
252b5132 2109
950d48e7 2110 l->obfd = output_bfd;
252b5132 2111
950d48e7 2112 *ptr = output_bfd;
cc481421 2113 ptr = &output_bfd->archive_next;
252b5132 2114
950d48e7 2115 last_element = this_element;
252b5132 2116
950d48e7 2117 this_element = bfd_openr_next_archived_file (ibfd, last_element);
252b5132 2118
950d48e7
NC
2119 bfd_close (last_element);
2120 }
252b5132 2121 }
d3ba0551 2122 *ptr = NULL;
252b5132 2123
8d8e0703 2124 filename = bfd_get_filename (obfd);
252b5132 2125 if (!bfd_close (obfd))
8d8e0703
AM
2126 {
2127 status = 1;
2128 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2129 return;
2130 }
252b5132 2131
8d8e0703 2132 filename = bfd_get_filename (ibfd);
252b5132 2133 if (!bfd_close (ibfd))
8d8e0703
AM
2134 {
2135 status = 1;
2136 bfd_nonfatal_message (filename, NULL, NULL, NULL);
2137 return;
2138 }
252b5132
RH
2139
2140 /* Delete all the files that we opened. */
2141 for (l = list; l != NULL; l = l->next)
2142 {
4c168fa3
AM
2143 if (l->obfd == NULL)
2144 rmdir (l->name);
2145 else
2146 {
2147 bfd_close (l->obfd);
2148 unlink (l->name);
2149 }
252b5132
RH
2150 }
2151 rmdir (dir);
2152}
2153
0408dee6
DK
2154static void
2155set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_handling style)
2156{
2157 /* This is only relevant to Coff targets. */
2158 if (bfd_get_flavour (output_bfd) == bfd_target_coff_flavour)
2159 {
78e82dc3
AM
2160 if (style == KEEP
2161 && bfd_get_flavour (input_bfd) == bfd_target_coff_flavour)
0408dee6
DK
2162 style = bfd_coff_long_section_names (input_bfd) ? ENABLE : DISABLE;
2163 bfd_coff_set_long_section_names (output_bfd, style != DISABLE);
2164 }
2165}
2166
252b5132
RH
2167/* The top-level control. */
2168
2169static void
84e2f313 2170copy_file (const char *input_filename, const char *output_filename,
8b31b6c4
NC
2171 const char *input_target, const char *output_target,
2172 const bfd_arch_info_type *input_arch)
252b5132
RH
2173{
2174 bfd *ibfd;
49c12576
AM
2175 char **obj_matching;
2176 char **core_matching;
52a476ee 2177 off_t size = get_file_size (input_filename);
252b5132 2178
52a476ee 2179 if (size < 1)
f24ddbdd 2180 {
52a476ee
L
2181 if (size == 0)
2182 non_fatal (_("error: the input file '%s' is empty"),
2183 input_filename);
f24ddbdd
NC
2184 status = 1;
2185 return;
2186 }
2187
252b5132
RH
2188 /* To allow us to do "strip *" without dying on the first
2189 non-object file, failures are nonfatal. */
252b5132
RH
2190 ibfd = bfd_openr (input_filename, input_target);
2191 if (ibfd == NULL)
2db6cde7
NS
2192 {
2193 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2194 status = 1;
2195 return;
2196 }
252b5132
RH
2197
2198 if (bfd_check_format (ibfd, bfd_archive))
2199 {
ee873e00 2200 bfd_boolean force_output_target;
252b5132
RH
2201 bfd *obfd;
2202
2203 /* bfd_get_target does not return the correct value until
2204 bfd_check_format succeeds. */
2205 if (output_target == NULL)
ee873e00
NC
2206 {
2207 output_target = bfd_get_target (ibfd);
2208 force_output_target = FALSE;
2209 }
2210 else
2211 force_output_target = TRUE;
252b5132
RH
2212
2213 obfd = bfd_openw (output_filename, output_target);
2214 if (obfd == NULL)
2db6cde7
NS
2215 {
2216 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2217 status = 1;
2218 return;
2219 }
0408dee6
DK
2220 /* This is a no-op on non-Coff targets. */
2221 set_long_section_mode (obfd, ibfd, long_section_names);
252b5132 2222
8b31b6c4 2223 copy_archive (ibfd, obfd, output_target, force_output_target, input_arch);
252b5132 2224 }
49c12576 2225 else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching))
252b5132
RH
2226 {
2227 bfd *obfd;
49c12576 2228 do_copy:
950d48e7 2229
252b5132
RH
2230 /* bfd_get_target does not return the correct value until
2231 bfd_check_format succeeds. */
2232 if (output_target == NULL)
2233 output_target = bfd_get_target (ibfd);
2234
2235 obfd = bfd_openw (output_filename, output_target);
2236 if (obfd == NULL)
2db6cde7
NS
2237 {
2238 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2239 status = 1;
2240 return;
2241 }
0408dee6
DK
2242 /* This is a no-op on non-Coff targets. */
2243 set_long_section_mode (obfd, ibfd, long_section_names);
252b5132 2244
8b31b6c4 2245 if (! copy_object (ibfd, obfd, input_arch))
a580b8e0 2246 status = 1;
252b5132
RH
2247
2248 if (!bfd_close (obfd))
8d8e0703
AM
2249 {
2250 status = 1;
2251 bfd_nonfatal_message (output_filename, NULL, NULL, NULL);
2252 return;
2253 }
252b5132
RH
2254
2255 if (!bfd_close (ibfd))
8d8e0703
AM
2256 {
2257 status = 1;
2258 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
2259 return;
2260 }
252b5132
RH
2261 }
2262 else
2263 {
49c12576
AM
2264 bfd_error_type obj_error = bfd_get_error ();
2265 bfd_error_type core_error;
b34976b6 2266
49c12576
AM
2267 if (bfd_check_format_matches (ibfd, bfd_core, &core_matching))
2268 {
2269 /* This probably can't happen.. */
2270 if (obj_error == bfd_error_file_ambiguously_recognized)
2271 free (obj_matching);
2272 goto do_copy;
2273 }
2274
2275 core_error = bfd_get_error ();
2276 /* Report the object error in preference to the core error. */
2277 if (obj_error != core_error)
2278 bfd_set_error (obj_error);
2279
2db6cde7 2280 bfd_nonfatal_message (input_filename, NULL, NULL, NULL);
57938635 2281
49c12576
AM
2282 if (obj_error == bfd_error_file_ambiguously_recognized)
2283 {
2284 list_matching_formats (obj_matching);
2285 free (obj_matching);
2286 }
2287 if (core_error == bfd_error_file_ambiguously_recognized)
252b5132 2288 {
49c12576
AM
2289 list_matching_formats (core_matching);
2290 free (core_matching);
252b5132 2291 }
57938635 2292
252b5132
RH
2293 status = 1;
2294 }
2295}
2296
594ef5db
NC
2297/* Add a name to the section renaming list. */
2298
2299static void
84e2f313
NC
2300add_section_rename (const char * old_name, const char * new_name,
2301 flagword flags)
594ef5db 2302{
91d6fa6a 2303 section_rename * srename;
594ef5db
NC
2304
2305 /* Check for conflicts first. */
91d6fa6a
NC
2306 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2307 if (strcmp (srename->old_name, old_name) == 0)
594ef5db
NC
2308 {
2309 /* Silently ignore duplicate definitions. */
91d6fa6a
NC
2310 if (strcmp (srename->new_name, new_name) == 0
2311 && srename->flags == flags)
594ef5db 2312 return;
0af11b59 2313
594ef5db
NC
2314 fatal (_("Multiple renames of section %s"), old_name);
2315 }
2316
91d6fa6a 2317 srename = (section_rename *) xmalloc (sizeof (* srename));
594ef5db 2318
91d6fa6a
NC
2319 srename->old_name = old_name;
2320 srename->new_name = new_name;
2321 srename->flags = flags;
2322 srename->next = section_rename_list;
0af11b59 2323
91d6fa6a 2324 section_rename_list = srename;
594ef5db
NC
2325}
2326
2327/* Check the section rename list for a new name of the input section
2328 ISECTION. Return the new name if one is found.
2329 Also set RETURNED_FLAGS to the flags to be used for this section. */
2330
2331static const char *
84e2f313
NC
2332find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection,
2333 flagword * returned_flags)
594ef5db
NC
2334{
2335 const char * old_name = bfd_section_name (ibfd, isection);
91d6fa6a 2336 section_rename * srename;
594ef5db
NC
2337
2338 /* Default to using the flags of the input section. */
2339 * returned_flags = bfd_get_section_flags (ibfd, isection);
2340
91d6fa6a
NC
2341 for (srename = section_rename_list; srename != NULL; srename = srename->next)
2342 if (strcmp (srename->old_name, old_name) == 0)
594ef5db 2343 {
91d6fa6a
NC
2344 if (srename->flags != (flagword) -1)
2345 * returned_flags = srename->flags;
594ef5db 2346
91d6fa6a 2347 return srename->new_name;
594ef5db
NC
2348 }
2349
2350 return old_name;
2351}
2352
80fccad2
BW
2353/* Once each of the sections is copied, we may still need to do some
2354 finalization work for private section headers. Do that here. */
2355
2356static void
2357setup_bfd_headers (bfd *ibfd, bfd *obfd)
2358{
80fccad2
BW
2359 /* Allow the BFD backend to copy any private data it understands
2360 from the input section to the output section. */
2361 if (! bfd_copy_private_header_data (ibfd, obfd))
2362 {
2db6cde7
NS
2363 status = 1;
2364 bfd_nonfatal_message (NULL, ibfd, NULL,
8d8e0703 2365 _("error in private header data"));
2db6cde7 2366 return;
80fccad2
BW
2367 }
2368
2369 /* All went well. */
2370 return;
80fccad2
BW
2371}
2372
594ef5db
NC
2373/* Create a section in OBFD with the same
2374 name and attributes as ISECTION in IBFD. */
252b5132
RH
2375
2376static void
84e2f313 2377setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
252b5132 2378{
3f5e193b 2379 bfd *obfd = (bfd *) obfdarg;
252b5132
RH
2380 struct section_list *p;
2381 sec_ptr osection;
2382 bfd_size_type size;
2383 bfd_vma vma;
2384 bfd_vma lma;
2385 flagword flags;
1a89cc7d 2386 const char *err;
594ef5db 2387 const char * name;
d7fb0dd2 2388 char *prefix = NULL;
66125551 2389 bfd_boolean make_nobits;
0af11b59 2390
2593f09a 2391 if (is_strip_section (ibfd, isection))
252b5132
RH
2392 return;
2393
b34976b6 2394 p = find_section_list (bfd_section_name (ibfd, isection), FALSE);
252b5132 2395 if (p != NULL)
b34976b6 2396 p->used = TRUE;
252b5132 2397
594ef5db
NC
2398 /* Get the, possibly new, name of the output section. */
2399 name = find_section_rename (ibfd, isection, & flags);
0af11b59 2400
d7fb0dd2 2401 /* Prefix sections. */
84e2f313
NC
2402 if ((prefix_alloc_sections_string)
2403 && (bfd_get_section_flags (ibfd, isection) & SEC_ALLOC))
d7fb0dd2
NC
2404 prefix = prefix_alloc_sections_string;
2405 else if (prefix_sections_string)
2406 prefix = prefix_sections_string;
2407
2408 if (prefix)
2409 {
2410 char *n;
2411
3f5e193b 2412 n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1);
d7fb0dd2
NC
2413 strcpy (n, prefix);
2414 strcat (n, name);
2415 name = n;
2416 }
66491ebc 2417
66125551 2418 make_nobits = FALSE;
551b43fd
AM
2419 if (p != NULL && p->set_flags)
2420 flags = p->flags | (flags & (SEC_HAS_CONTENTS | SEC_RELOC));
42bb2e33 2421 else if (strip_symbols == STRIP_NONDEBUG
66125551
AM
2422 && (flags & SEC_ALLOC) != 0
2423 && (ibfd->xvec->flavour != bfd_target_elf_flavour
2424 || elf_section_type (isection) != SHT_NOTE))
2425 {
2426 flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
2427 if (obfd->xvec->flavour == bfd_target_elf_flavour)
2428 {
2429 make_nobits = TRUE;
2430
2431 /* Twiddle the input section flags so that it seems to
2432 elf.c:copy_private_bfd_data that section flags have not
2433 changed between input and output sections. This hack
2434 prevents wholesale rewriting of the program headers. */
2435 isection->flags &= ~(SEC_HAS_CONTENTS | SEC_LOAD);
2436 }
2437 }
551b43fd
AM
2438
2439 osection = bfd_make_section_anyway_with_flags (obfd, name, flags);
57938635 2440
252b5132
RH
2441 if (osection == NULL)
2442 {
2db6cde7 2443 err = _("failed to create output section");
252b5132
RH
2444 goto loser;
2445 }
2446
66125551 2447 if (make_nobits)
551b43fd
AM
2448 elf_section_type (osection) = SHT_NOBITS;
2449
252b5132
RH
2450 size = bfd_section_size (ibfd, isection);
2451 if (copy_byte >= 0)
2452 size = (size + interleave - 1) / interleave;
d3e52d40
RS
2453 else if (extract_symbol)
2454 size = 0;
252b5132
RH
2455 if (! bfd_set_section_size (obfd, osection, size))
2456 {
2db6cde7 2457 err = _("failed to set size");
252b5132
RH
2458 goto loser;
2459 }
57938635 2460
252b5132
RH
2461 vma = bfd_section_vma (ibfd, isection);
2462 if (p != NULL && p->change_vma == CHANGE_MODIFY)
2463 vma += p->vma_val;
2464 else if (p != NULL && p->change_vma == CHANGE_SET)
2465 vma = p->vma_val;
2466 else
2467 vma += change_section_address;
57938635 2468
237dcb53 2469 if (! bfd_set_section_vma (obfd, osection, vma))
252b5132 2470 {
2db6cde7 2471 err = _("failed to set vma");
252b5132
RH
2472 goto loser;
2473 }
2474
2475 lma = isection->lma;
2476 if ((p != NULL) && p->change_lma != CHANGE_IGNORE)
2477 {
2478 if (p->change_lma == CHANGE_MODIFY)
2479 lma += p->lma_val;
2480 else if (p->change_lma == CHANGE_SET)
2481 lma = p->lma_val;
2482 else
2483 abort ();
2484 }
2485 else
2486 lma += change_section_address;
57938635 2487
237dcb53 2488 osection->lma = lma;
252b5132
RH
2489
2490 /* FIXME: This is probably not enough. If we change the LMA we
2491 may have to recompute the header for the file as well. */
b34976b6
AM
2492 if (!bfd_set_section_alignment (obfd,
2493 osection,
2494 bfd_section_alignment (ibfd, isection)))
252b5132 2495 {
2db6cde7 2496 err = _("failed to set alignment");
252b5132
RH
2497 goto loser;
2498 }
2499
bc408b8a
JJ
2500 /* Copy merge entity size. */
2501 osection->entsize = isection->entsize;
2502
252b5132
RH
2503 /* This used to be mangle_section; we do here to avoid using
2504 bfd_get_section_by_name since some formats allow multiple
2505 sections with the same name. */
2506 isection->output_section = osection;
237dcb53 2507 isection->output_offset = 0;
d3e52d40
RS
2508
2509 /* Do not copy backend data if --extract-symbol is passed; anything
2510 that needs to look at the section contents will fail. */
2511 if (extract_symbol)
2512 return;
252b5132 2513
119f4245
AM
2514 if ((isection->flags & SEC_GROUP) != 0)
2515 {
2516 asymbol *gsym = group_signature (isection);
2517
2518 if (gsym != NULL)
2519 {
2520 gsym->flags |= BSF_KEEP;
2521 if (ibfd->xvec->flavour == bfd_target_elf_flavour)
2522 elf_group_id (isection) = gsym;
2523 }
2524 }
2525
252b5132
RH
2526 /* Allow the BFD backend to copy any private data it understands
2527 from the input section to the output section. */
42bb2e33 2528 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
252b5132 2529 {
2db6cde7 2530 err = _("failed to copy private data");
252b5132
RH
2531 goto loser;
2532 }
2533
594ef5db 2534 /* All went well. */
252b5132
RH
2535 return;
2536
2537loser:
252b5132 2538 status = 1;
2db6cde7 2539 bfd_nonfatal_message (NULL, obfd, osection, err);
252b5132
RH
2540}
2541
2542/* Copy the data of input section ISECTION of IBFD
2543 to an output section with the same name in OBFD.
2544 If stripping then don't copy any relocation info. */
2545
2546static void
84e2f313 2547copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg)
252b5132 2548{
3f5e193b 2549 bfd *obfd = (bfd *) obfdarg;
252b5132
RH
2550 struct section_list *p;
2551 arelent **relpp;
2552 long relcount;
2553 sec_ptr osection;
2554 bfd_size_type size;
2555 long relsize;
dc156bc0 2556 flagword flags;
252b5132 2557
594ef5db
NC
2558 /* If we have already failed earlier on,
2559 do not keep on generating complaints now. */
252b5132
RH
2560 if (status != 0)
2561 return;
57938635 2562
2593f09a 2563 if (is_strip_section (ibfd, isection))
e0c60db2 2564 return;
252b5132 2565
2593f09a 2566 flags = bfd_get_section_flags (ibfd, isection);
dc156bc0
AM
2567 if ((flags & SEC_GROUP) != 0)
2568 return;
2569
252b5132 2570 osection = isection->output_section;
135dfb4a 2571 size = bfd_get_section_size (isection);
252b5132
RH
2572
2573 if (size == 0 || osection == 0)
2574 return;
2575
237dcb53
AM
2576 if (extract_symbol)
2577 return;
2578
2593f09a
NC
2579 p = find_section_list (bfd_get_section_name (ibfd, isection), FALSE);
2580
0af11b59 2581 /* Core files do not need to be relocated. */
4dd67f29
MS
2582 if (bfd_get_format (obfd) == bfd_core)
2583 relsize = 0;
2584 else
ed570f48
NC
2585 {
2586 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
4dd67f29 2587
ed570f48
NC
2588 if (relsize < 0)
2589 {
2590 /* Do not complain if the target does not support relocations. */
2591 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2592 relsize = 0;
2593 else
2db6cde7
NS
2594 {
2595 status = 1;
2596 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2597 return;
2598 }
ed570f48
NC
2599 }
2600 }
57938635 2601
252b5132 2602 if (relsize == 0)
d3ba0551 2603 bfd_set_reloc (obfd, osection, NULL, 0);
252b5132
RH
2604 else
2605 {
3f5e193b 2606 relpp = (arelent **) xmalloc (relsize);
252b5132
RH
2607 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
2608 if (relcount < 0)
2db6cde7
NS
2609 {
2610 status = 1;
2611 bfd_nonfatal_message (NULL, ibfd, isection,
2612 _("relocation count is negative"));
2613 return;
2614 }
57938635 2615
252b5132
RH
2616 if (strip_symbols == STRIP_ALL)
2617 {
2618 /* Remove relocations which are not in
0af11b59 2619 keep_strip_specific_list. */
252b5132
RH
2620 arelent **temp_relpp;
2621 long temp_relcount = 0;
2622 long i;
57938635 2623
3f5e193b 2624 temp_relpp = (arelent **) xmalloc (relsize);
252b5132 2625 for (i = 0; i < relcount; i++)
d3ba0551 2626 if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr),
047c9024 2627 keep_specific_htab))
252b5132
RH
2628 temp_relpp [temp_relcount++] = relpp [i];
2629 relcount = temp_relcount;
2630 free (relpp);
2631 relpp = temp_relpp;
2632 }
e0c60db2 2633
d3ba0551 2634 bfd_set_reloc (obfd, osection, relcount == 0 ? NULL : relpp, relcount);
f0312d39
JJ
2635 if (relcount == 0)
2636 free (relpp);
252b5132 2637 }
57938635 2638
0af11b59 2639 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS
4dd67f29 2640 && bfd_get_section_flags (obfd, osection) & SEC_HAS_CONTENTS)
252b5132 2641 {
d3ba0551 2642 void *memhunk = xmalloc (size);
252b5132 2643
d3ba0551 2644 if (!bfd_get_section_contents (ibfd, isection, memhunk, 0, size))
2db6cde7
NS
2645 {
2646 status = 1;
2647 bfd_nonfatal_message (NULL, ibfd, isection, NULL);
2648 return;
2649 }
252b5132 2650
9e48b4c6
NC
2651 if (reverse_bytes)
2652 {
2653 /* We don't handle leftover bytes (too many possible behaviors,
2654 and we don't know what the user wants). The section length
2655 must be a multiple of the number of bytes to swap. */
2656 if ((size % reverse_bytes) == 0)
2657 {
2658 unsigned long i, j;
2659 bfd_byte b;
2660
2661 for (i = 0; i < size; i += reverse_bytes)
2662 for (j = 0; j < (unsigned long)(reverse_bytes / 2); j++)
2663 {
2664 bfd_byte *m = (bfd_byte *) memhunk;
2665
2666 b = m[i + j];
2667 m[i + j] = m[(i + reverse_bytes) - (j + 1)];
2668 m[(i + reverse_bytes) - (j + 1)] = b;
2669 }
2670 }
2671 else
2672 /* User must pad the section up in order to do this. */
2673 fatal (_("cannot reverse bytes: length of section %s must be evenly divisible by %d"),
2674 bfd_section_name (ibfd, isection), reverse_bytes);
2675 }
2676
57938635 2677 if (copy_byte >= 0)
5e675b72
AM
2678 {
2679 /* Keep only every `copy_byte'th byte in MEMHUNK. */
2f01ffbf 2680 char *from = (char *) memhunk + copy_byte;
3f5e193b 2681 char *to = (char *) memhunk;
2f01ffbf 2682 char *end = (char *) memhunk + size;
5e675b72
AM
2683
2684 for (; from < end; from += interleave)
2685 *to++ = *from;
2686
2687 size = (size + interleave - 1 - copy_byte) / interleave;
2688 osection->lma /= interleave;
2689 }
252b5132 2690
d3ba0551 2691 if (!bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2db6cde7
NS
2692 {
2693 status = 1;
2694 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2695 return;
2696 }
252b5132
RH
2697 free (memhunk);
2698 }
2699 else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
2700 {
d3ba0551 2701 void *memhunk = xmalloc (size);
252b5132
RH
2702
2703 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
2704 flag--they can just remove the section entirely and add it
2705 back again. However, we do permit them to turn on the
2706 SEC_HAS_CONTENTS flag, and take it to mean that the section
2707 contents should be zeroed out. */
2708
2709 memset (memhunk, 0, size);
d3ba0551 2710 if (! bfd_set_section_contents (obfd, osection, memhunk, 0, size))
2db6cde7
NS
2711 {
2712 status = 1;
2713 bfd_nonfatal_message (NULL, obfd, osection, NULL);
2714 return;
2715 }
252b5132
RH
2716 free (memhunk);
2717 }
2718}
2719
2720/* Get all the sections. This is used when --gap-fill or --pad-to is
2721 used. */
2722
2723static void
84e2f313 2724get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg)
252b5132 2725{
3f5e193b 2726 asection ***secppp = (asection ***) secppparg;
252b5132
RH
2727
2728 **secppp = osection;
2729 ++(*secppp);
2730}
2731
2732/* Sort sections by VMA. This is called via qsort, and is used when
2733 --gap-fill or --pad-to is used. We force non loadable or empty
2734 sections to the front, where they are easier to ignore. */
2735
2736static int
84e2f313 2737compare_section_lma (const void *arg1, const void *arg2)
252b5132 2738{
3f5e193b
NC
2739 const asection *const *sec1 = (const asection * const *) arg1;
2740 const asection *const *sec2 = (const asection * const *) arg2;
252b5132
RH
2741 flagword flags1, flags2;
2742
2743 /* Sort non loadable sections to the front. */
2744 flags1 = (*sec1)->flags;
2745 flags2 = (*sec2)->flags;
2746 if ((flags1 & SEC_HAS_CONTENTS) == 0
2747 || (flags1 & SEC_LOAD) == 0)
2748 {
2749 if ((flags2 & SEC_HAS_CONTENTS) != 0
2750 && (flags2 & SEC_LOAD) != 0)
2751 return -1;
2752 }
2753 else
2754 {
2755 if ((flags2 & SEC_HAS_CONTENTS) == 0
2756 || (flags2 & SEC_LOAD) == 0)
2757 return 1;
2758 }
2759
2760 /* Sort sections by LMA. */
2761 if ((*sec1)->lma > (*sec2)->lma)
2762 return 1;
2763 else if ((*sec1)->lma < (*sec2)->lma)
2764 return -1;
2765
2766 /* Sort sections with the same LMA by size. */
135dfb4a 2767 if (bfd_get_section_size (*sec1) > bfd_get_section_size (*sec2))
252b5132 2768 return 1;
135dfb4a 2769 else if (bfd_get_section_size (*sec1) < bfd_get_section_size (*sec2))
252b5132
RH
2770 return -1;
2771
2772 return 0;
2773}
2774
2775/* Mark all the symbols which will be used in output relocations with
2776 the BSF_KEEP flag so that those symbols will not be stripped.
2777
2778 Ignore relocations which will not appear in the output file. */
2779
2780static void
84e2f313 2781mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg)
252b5132 2782{
3f5e193b 2783 asymbol **symbols = (asymbol **) symbolsarg;
252b5132
RH
2784 long relsize;
2785 arelent **relpp;
2786 long relcount, i;
2787
2788 /* Ignore an input section with no corresponding output section. */
2789 if (isection->output_section == NULL)
2790 return;
2791
2792 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
2793 if (relsize < 0)
ed570f48
NC
2794 {
2795 /* Do not complain if the target does not support relocations. */
2796 if (relsize == -1 && bfd_get_error () == bfd_error_invalid_operation)
2797 return;
2798 bfd_fatal (bfd_get_filename (ibfd));
2799 }
252b5132
RH
2800
2801 if (relsize == 0)
2802 return;
2803
3f5e193b 2804 relpp = (arelent **) xmalloc (relsize);
252b5132
RH
2805 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
2806 if (relcount < 0)
2807 bfd_fatal (bfd_get_filename (ibfd));
2808
ec5d57d5
NC
2809 /* Examine each symbol used in a relocation. If it's not one of the
2810 special bfd section symbols, then mark it with BSF_KEEP. */
252b5132
RH
2811 for (i = 0; i < relcount; i++)
2812 {
ec5d57d5
NC
2813 if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
2814 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
2815 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
2816 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
252b5132
RH
2817 }
2818
2819 if (relpp != NULL)
2820 free (relpp);
2821}
2822
2823/* Write out debugging information. */
2824
b34976b6 2825static bfd_boolean
84e2f313
NC
2826write_debugging_info (bfd *obfd, void *dhandle,
2827 long *symcountp ATTRIBUTE_UNUSED,
2828 asymbol ***symppp ATTRIBUTE_UNUSED)
252b5132
RH
2829{
2830 if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
2831 return write_ieee_debugging_info (obfd, dhandle);
2832
2833 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
2834 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
2835 {
2836 bfd_byte *syms, *strings;
2837 bfd_size_type symsize, stringsize;
2838 asection *stabsec, *stabstrsec;
551b43fd 2839 flagword flags;
252b5132
RH
2840
2841 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
2842 &symsize, &strings,
2843 &stringsize))
b34976b6 2844 return FALSE;
252b5132 2845
551b43fd
AM
2846 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DEBUGGING;
2847 stabsec = bfd_make_section_with_flags (obfd, ".stab", flags);
2848 stabstrsec = bfd_make_section_with_flags (obfd, ".stabstr", flags);
252b5132
RH
2849 if (stabsec == NULL
2850 || stabstrsec == NULL
2851 || ! bfd_set_section_size (obfd, stabsec, symsize)
2852 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
2853 || ! bfd_set_section_alignment (obfd, stabsec, 2)
551b43fd 2854 || ! bfd_set_section_alignment (obfd, stabstrsec, 0))
252b5132 2855 {
2db6cde7
NS
2856 bfd_nonfatal_message (NULL, obfd, NULL,
2857 _("can't create debugging section"));
b34976b6 2858 return FALSE;
252b5132
RH
2859 }
2860
2861 /* We can get away with setting the section contents now because
2862 the next thing the caller is going to do is copy over the
2863 real sections. We may someday have to split the contents
2864 setting out of this function. */
d3ba0551
AM
2865 if (! bfd_set_section_contents (obfd, stabsec, syms, 0, symsize)
2866 || ! bfd_set_section_contents (obfd, stabstrsec, strings, 0,
2867 stringsize))
252b5132 2868 {
2db6cde7
NS
2869 bfd_nonfatal_message (NULL, obfd, NULL,
2870 _("can't set debugging section contents"));
b34976b6 2871 return FALSE;
252b5132
RH
2872 }
2873
b34976b6 2874 return TRUE;
252b5132
RH
2875 }
2876
2db6cde7
NS
2877 bfd_nonfatal_message (NULL, obfd, NULL,
2878 _("don't know how to write debugging information for %s"),
2879 bfd_get_target (obfd));
b34976b6 2880 return FALSE;
252b5132
RH
2881}
2882
2883static int
84e2f313 2884strip_main (int argc, char *argv[])
252b5132 2885{
7c29036b
NC
2886 char *input_target = NULL;
2887 char *output_target = NULL;
b34976b6 2888 bfd_boolean show_version = FALSE;
7c29036b
NC
2889 bfd_boolean formats_info = FALSE;
2890 int c;
2891 int i;
252b5132
RH
2892 struct section_list *p;
2893 char *output_file = NULL;
2894
5fe11841 2895 while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpdgxXHhVvw",
252b5132
RH
2896 strip_options, (int *) 0)) != EOF)
2897 {
2898 switch (c)
2899 {
2900 case 'I':
2901 input_target = optarg;
2902 break;
2903 case 'O':
2904 output_target = optarg;
2905 break;
2906 case 'F':
2907 input_target = output_target = optarg;
2908 break;
2909 case 'R':
b34976b6
AM
2910 p = find_section_list (optarg, TRUE);
2911 p->remove = TRUE;
2912 sections_removed = TRUE;
252b5132
RH
2913 break;
2914 case 's':
2915 strip_symbols = STRIP_ALL;
2916 break;
2917 case 'S':
2918 case 'g':
db4f6831 2919 case 'd': /* Historic BSD alias for -g. Used by early NetBSD. */
252b5132
RH
2920 strip_symbols = STRIP_DEBUG;
2921 break;
2922 case OPTION_STRIP_UNNEEDED:
2923 strip_symbols = STRIP_UNNEEDED;
2924 break;
2925 case 'K':
047c9024 2926 add_specific_symbol (optarg, keep_specific_htab);
252b5132
RH
2927 break;
2928 case 'N':
047c9024 2929 add_specific_symbol (optarg, strip_specific_htab);
252b5132
RH
2930 break;
2931 case 'o':
2932 output_file = optarg;
2933 break;
2934 case 'p':
b34976b6 2935 preserve_dates = TRUE;
252b5132
RH
2936 break;
2937 case 'x':
2938 discard_locals = LOCALS_ALL;
2939 break;
2940 case 'X':
2941 discard_locals = LOCALS_START_L;
2942 break;
2943 case 'v':
b34976b6 2944 verbose = TRUE;
252b5132
RH
2945 break;
2946 case 'V':
b34976b6 2947 show_version = TRUE;
252b5132 2948 break;
7c29036b
NC
2949 case OPTION_FORMATS_INFO:
2950 formats_info = TRUE;
2951 break;
ed1653a7
NC
2952 case OPTION_ONLY_KEEP_DEBUG:
2953 strip_symbols = STRIP_NONDEBUG;
2954 break;
1637cd90
JB
2955 case OPTION_KEEP_FILE_SYMBOLS:
2956 keep_file_symbols = 1;
2957 break;
252b5132 2958 case 0:
594ef5db
NC
2959 /* We've been given a long option. */
2960 break;
5fe11841
NC
2961 case 'w':
2962 wildcard = TRUE;
2963 break;
8b53311e 2964 case 'H':
252b5132
RH
2965 case 'h':
2966 strip_usage (stdout, 0);
2967 default:
2968 strip_usage (stderr, 1);
2969 }
2970 }
2971
84e2f313
NC
2972 if (formats_info)
2973 {
2974 display_info ();
2975 return 0;
2976 }
c1c0eb9e 2977
252b5132
RH
2978 if (show_version)
2979 print_version ("strip");
2980
2981 /* Default is to strip all symbols. */
2982 if (strip_symbols == STRIP_UNDEF
2983 && discard_locals == LOCALS_UNDEF
047c9024 2984 && htab_elements (strip_specific_htab) == 0)
252b5132
RH
2985 strip_symbols = STRIP_ALL;
2986
d3ba0551 2987 if (output_target == NULL)
252b5132
RH
2988 output_target = input_target;
2989
2990 i = optind;
2991 if (i == argc
2992 || (output_file != NULL && (i + 1) < argc))
2993 strip_usage (stderr, 1);
2994
2995 for (; i < argc; i++)
2996 {
2997 int hold_status = status;
2998 struct stat statbuf;
2999 char *tmpname;
3000
f24ddbdd 3001 if (get_file_size (argv[i]) < 1)
d68c385b
NC
3002 {
3003 status = 1;
3004 continue;
3005 }
f24ddbdd 3006
252b5132 3007 if (preserve_dates)
f24ddbdd
NC
3008 /* No need to check the return value of stat().
3009 It has already been checked in get_file_size(). */
3010 stat (argv[i], &statbuf);
252b5132 3011
12f498a7 3012 if (output_file == NULL || strcmp (argv[i], output_file) == 0)
252b5132 3013 tmpname = make_tempname (argv[i]);
12f498a7
NS
3014 else
3015 tmpname = output_file;
252b5132 3016
f9c026a8
NC
3017 if (tmpname == NULL)
3018 {
2db6cde7
NS
3019 bfd_nonfatal_message (argv[i], NULL, NULL,
3020 _("could not create temporary file to hold stripped copy"));
f9c026a8
NC
3021 status = 1;
3022 continue;
3023 }
3024
d68c385b 3025 status = 0;
8b31b6c4 3026 copy_file (argv[i], tmpname, input_target, output_target, NULL);
252b5132
RH
3027 if (status == 0)
3028 {
3029 if (preserve_dates)
3030 set_times (tmpname, &statbuf);
12f498a7 3031 if (output_file != tmpname)
92fac5ec
L
3032 status = (smart_rename (tmpname,
3033 output_file ? output_file : argv[i],
3034 preserve_dates) != 0);
3035 if (status == 0)
3036 status = hold_status;
252b5132
RH
3037 }
3038 else
bb14f524 3039 unlink_if_ordinary (tmpname);
12f498a7 3040 if (output_file != tmpname)
252b5132
RH
3041 free (tmpname);
3042 }
3043
d68c385b 3044 return status;
252b5132
RH
3045}
3046
92dd4511
L
3047/* Set up PE subsystem. */
3048
3049static void
3050set_pe_subsystem (const char *s)
3051{
3052 const char *version, *subsystem;
3053 size_t i;
3054 static const struct
3055 {
3056 const char *name;
3057 const char set_def;
3058 const short value;
3059 }
3060 v[] =
3061 {
3062 { "native", 0, IMAGE_SUBSYSTEM_NATIVE },
3063 { "windows", 0, IMAGE_SUBSYSTEM_WINDOWS_GUI },
3064 { "console", 0, IMAGE_SUBSYSTEM_WINDOWS_CUI },
3065 { "posix", 0, IMAGE_SUBSYSTEM_POSIX_CUI },
3066 { "wince", 0, IMAGE_SUBSYSTEM_WINDOWS_CE_GUI },
3067 { "efi-app", 1, IMAGE_SUBSYSTEM_EFI_APPLICATION },
3068 { "efi-bsd", 1, IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER },
3069 { "efi-rtd", 1, IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER },
d9118602 3070 { "sal-rtd", 1, IMAGE_SUBSYSTEM_SAL_RUNTIME_DRIVER },
92dd4511
L
3071 { "xbox", 0, IMAGE_SUBSYSTEM_XBOX }
3072 };
3073 short value;
3074 char *copy;
3075 int set_def = -1;
3076
3077 /* Check for the presence of a version number. */
3078 version = strchr (s, ':');
3079 if (version == NULL)
3080 subsystem = s;
3081 else
3082 {
3083 int len = version - s;
3084 copy = xstrdup (s);
3085 subsystem = copy;
3086 copy[len] = '\0';
3087 version = copy + 1 + len;
3088 pe_major_subsystem_version = strtoul (version, &copy, 0);
3089 if (*copy == '.')
3090 pe_minor_subsystem_version = strtoul (copy + 1, &copy, 0);
3091 if (*copy != '\0')
3092 non_fatal (_("%s: bad version in PE subsystem"), s);
3093 }
3094
3095 /* Check for numeric subsystem. */
3096 value = (short) strtol (subsystem, &copy, 0);
3097 if (*copy == '\0')
3098 {
3099 for (i = 0; i < ARRAY_SIZE (v); i++)
3100 if (v[i].value == value)
3101 {
3102 pe_subsystem = value;
3103 set_def = v[i].set_def;
3104 break;
3105 }
3106 }
3107 else
3108 {
3109 /* Search for subsystem by name. */
3110 for (i = 0; i < ARRAY_SIZE (v); i++)
3111 if (strcmp (subsystem, v[i].name) == 0)
3112 {
3113 pe_subsystem = v[i].value;
3114 set_def = v[i].set_def;
3115 break;
3116 }
3117 }
3118
3119 switch (set_def)
3120 {
3121 case -1:
3122 fatal (_("unknown PE subsystem: %s"), s);
3123 break;
3124 case 0:
3125 break;
3126 default:
3127 if (pe_file_alignment == (bfd_vma) -1)
3128 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
3129 if (pe_section_alignment == (bfd_vma) -1)
3130 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
3131 break;
3132 }
3133}
3134
3135/* Convert EFI target to PEI target. */
3136
3137static void
3138convert_efi_target (char *efi)
3139{
3140 efi[0] = 'p';
3141 efi[1] = 'e';
3142 efi[2] = 'i';
3143
3144 if (strcmp (efi + 4, "ia32") == 0)
3145 {
3146 /* Change ia32 to i386. */
3147 efi[5]= '3';
3148 efi[6]= '8';
3149 efi[7]= '6';
3150 }
3151 else if (strcmp (efi + 4, "x86_64") == 0)
3152 {
3153 /* Change x86_64 to x86-64. */
3154 efi[7] = '-';
3155 }
3156}
3157
252b5132 3158static int
84e2f313 3159copy_main (int argc, char *argv[])
252b5132 3160{
7c29036b
NC
3161 char *input_filename = NULL;
3162 char *output_filename = NULL;
c1c0eb9e 3163 char *tmpname;
7c29036b
NC
3164 char *input_target = NULL;
3165 char *output_target = NULL;
b34976b6
AM
3166 bfd_boolean show_version = FALSE;
3167 bfd_boolean change_warn = TRUE;
7c29036b 3168 bfd_boolean formats_info = FALSE;
252b5132
RH
3169 int c;
3170 struct section_list *p;
3171 struct stat statbuf;
8b31b6c4 3172 const bfd_arch_info_type *input_arch = NULL;
252b5132 3173
5fe11841 3174 while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w",
252b5132
RH
3175 copy_options, (int *) 0)) != EOF)
3176 {
3177 switch (c)
3178 {
3179 case 'b':
3180 copy_byte = atoi (optarg);
3181 if (copy_byte < 0)
3182 fatal (_("byte number must be non-negative"));
3183 break;
57938635 3184
0af11b59 3185 case 'B':
8b31b6c4
NC
3186 input_arch = bfd_scan_arch (optarg);
3187 if (input_arch == NULL)
3188 fatal (_("architecture %s unknown"), optarg);
0af11b59 3189 break;
43a0748c 3190
252b5132
RH
3191 case 'i':
3192 interleave = atoi (optarg);
3193 if (interleave < 1)
3194 fatal (_("interleave must be positive"));
3195 break;
57938635 3196
252b5132
RH
3197 case 'I':
3198 case 's': /* "source" - 'I' is preferred */
3199 input_target = optarg;
3200 break;
57938635 3201
252b5132
RH
3202 case 'O':
3203 case 'd': /* "destination" - 'O' is preferred */
3204 output_target = optarg;
3205 break;
57938635 3206
252b5132
RH
3207 case 'F':
3208 input_target = output_target = optarg;
3209 break;
57938635 3210
f91ea849 3211 case 'j':
b34976b6 3212 p = find_section_list (optarg, TRUE);
f91ea849
ILT
3213 if (p->remove)
3214 fatal (_("%s both copied and removed"), optarg);
b34976b6
AM
3215 p->copy = TRUE;
3216 sections_copied = TRUE;
f91ea849 3217 break;
57938635 3218
252b5132 3219 case 'R':
b34976b6 3220 p = find_section_list (optarg, TRUE);
f91ea849
ILT
3221 if (p->copy)
3222 fatal (_("%s both copied and removed"), optarg);
b34976b6
AM
3223 p->remove = TRUE;
3224 sections_removed = TRUE;
252b5132 3225 break;
57938635 3226
252b5132
RH
3227 case 'S':
3228 strip_symbols = STRIP_ALL;
3229 break;
57938635 3230
252b5132
RH
3231 case 'g':
3232 strip_symbols = STRIP_DEBUG;
3233 break;
57938635 3234
252b5132
RH
3235 case OPTION_STRIP_UNNEEDED:
3236 strip_symbols = STRIP_UNNEEDED;
3237 break;
57938635 3238
ed1653a7
NC
3239 case OPTION_ONLY_KEEP_DEBUG:
3240 strip_symbols = STRIP_NONDEBUG;
3241 break;
3242
1637cd90
JB
3243 case OPTION_KEEP_FILE_SYMBOLS:
3244 keep_file_symbols = 1;
3245 break;
3246
2593f09a
NC
3247 case OPTION_ADD_GNU_DEBUGLINK:
3248 gnu_debuglink_filename = optarg;
3249 break;
3250
252b5132 3251 case 'K':
047c9024 3252 add_specific_symbol (optarg, keep_specific_htab);
252b5132 3253 break;
57938635 3254
252b5132 3255 case 'N':
047c9024 3256 add_specific_symbol (optarg, strip_specific_htab);
252b5132 3257 break;
57938635 3258
bcf32829 3259 case OPTION_STRIP_UNNEEDED_SYMBOL:
047c9024 3260 add_specific_symbol (optarg, strip_unneeded_htab);
bcf32829
JB
3261 break;
3262
252b5132 3263 case 'L':
047c9024 3264 add_specific_symbol (optarg, localize_specific_htab);
252b5132 3265 break;
57938635 3266
7b4a0685 3267 case OPTION_GLOBALIZE_SYMBOL:
047c9024 3268 add_specific_symbol (optarg, globalize_specific_htab);
7b4a0685
NC
3269 break;
3270
16b2b71c 3271 case 'G':
047c9024 3272 add_specific_symbol (optarg, keepglobal_specific_htab);
16b2b71c
NC
3273 break;
3274
252b5132 3275 case 'W':
047c9024 3276 add_specific_symbol (optarg, weaken_specific_htab);
252b5132 3277 break;
57938635 3278
252b5132 3279 case 'p':
b34976b6 3280 preserve_dates = TRUE;
252b5132 3281 break;
57938635 3282
5fe11841
NC
3283 case 'w':
3284 wildcard = TRUE;
3285 break;
3286
252b5132
RH
3287 case 'x':
3288 discard_locals = LOCALS_ALL;
3289 break;
57938635 3290
252b5132
RH
3291 case 'X':
3292 discard_locals = LOCALS_START_L;
3293 break;
57938635 3294
252b5132 3295 case 'v':
b34976b6 3296 verbose = TRUE;
252b5132 3297 break;
57938635 3298
252b5132 3299 case 'V':
b34976b6 3300 show_version = TRUE;
252b5132 3301 break;
57938635 3302
7c29036b
NC
3303 case OPTION_FORMATS_INFO:
3304 formats_info = TRUE;
3305 break;
3306
252b5132 3307 case OPTION_WEAKEN:
b34976b6 3308 weaken = TRUE;
252b5132 3309 break;
57938635 3310
252b5132
RH
3311 case OPTION_ADD_SECTION:
3312 {
3313 const char *s;
500ee42e 3314 size_t off, alloc;
252b5132 3315 struct section_add *pa;
252b5132
RH
3316 FILE *f;
3317
3318 s = strchr (optarg, '=');
57938635 3319
252b5132 3320 if (s == NULL)
57938635 3321 fatal (_("bad format for %s"), "--add-section");
252b5132 3322
3f5e193b 3323 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
500ee42e 3324 pa->name = xstrndup (optarg, s - optarg);
252b5132
RH
3325 pa->filename = s + 1;
3326
500ee42e
ILT
3327 /* We don't use get_file_size so that we can do
3328 --add-section .note.GNU_stack=/dev/null
3329 get_file_size doesn't work on /dev/null. */
57938635 3330
500ee42e 3331 f = fopen (pa->filename, FOPEN_RB);
252b5132 3332 if (f == NULL)
84e2f313
NC
3333 fatal (_("cannot open: %s: %s"),
3334 pa->filename, strerror (errno));
57938635 3335
500ee42e
ILT
3336 off = 0;
3337 alloc = 4096;
3338 pa->contents = (bfd_byte *) xmalloc (alloc);
3339 while (!feof (f))
3340 {
3341 off_t got;
3342
3343 if (off == alloc)
3344 {
3345 alloc <<= 1;
3346 pa->contents = (bfd_byte *) xrealloc (pa->contents, alloc);
3347 }
3348
3349 got = fread (pa->contents + off, 1, alloc - off, f);
3350 if (ferror (f))
3351 fatal (_("%s: fread failed"), pa->filename);
3352
3353 off += got;
3354 }
3355
3356 pa->size = off;
252b5132
RH
3357
3358 fclose (f);
3359
3360 pa->next = add_sections;
3361 add_sections = pa;
3362 }
3363 break;
57938635 3364
252b5132
RH
3365 case OPTION_CHANGE_START:
3366 change_start = parse_vma (optarg, "--change-start");
3367 break;
57938635 3368
252b5132
RH
3369 case OPTION_CHANGE_SECTION_ADDRESS:
3370 case OPTION_CHANGE_SECTION_LMA:
3371 case OPTION_CHANGE_SECTION_VMA:
3372 {
3373 const char *s;
3374 int len;
3375 char *name;
b4c96d0d 3376 char *option = NULL;
252b5132 3377 bfd_vma val;
b4c96d0d 3378 enum change_action what = CHANGE_IGNORE;
57938635 3379
252b5132
RH
3380 switch (c)
3381 {
b4c96d0d
ILT
3382 case OPTION_CHANGE_SECTION_ADDRESS:
3383 option = "--change-section-address";
3384 break;
3385 case OPTION_CHANGE_SECTION_LMA:
3386 option = "--change-section-lma";
3387 break;
3388 case OPTION_CHANGE_SECTION_VMA:
3389 option = "--change-section-vma";
3390 break;
252b5132 3391 }
57938635 3392
252b5132
RH
3393 s = strchr (optarg, '=');
3394 if (s == NULL)
3395 {
3396 s = strchr (optarg, '+');
3397 if (s == NULL)
3398 {
3399 s = strchr (optarg, '-');
3400 if (s == NULL)
3401 fatal (_("bad format for %s"), option);
3402 }
3403 }
3404
3405 len = s - optarg;
3f5e193b 3406 name = (char *) xmalloc (len + 1);
252b5132
RH
3407 strncpy (name, optarg, len);
3408 name[len] = '\0';
3409
b34976b6 3410 p = find_section_list (name, TRUE);
252b5132
RH
3411
3412 val = parse_vma (s + 1, option);
3413
3414 switch (*s)
3415 {
3416 case '=': what = CHANGE_SET; break;
3417 case '-': val = - val; /* Drop through. */
3418 case '+': what = CHANGE_MODIFY; break;
3419 }
57938635 3420
252b5132
RH
3421 switch (c)
3422 {
3423 case OPTION_CHANGE_SECTION_ADDRESS:
3424 p->change_vma = what;
3425 p->vma_val = val;
3426 /* Drop through. */
57938635 3427
252b5132
RH
3428 case OPTION_CHANGE_SECTION_LMA:
3429 p->change_lma = what;
3430 p->lma_val = val;
3431 break;
57938635 3432
252b5132
RH
3433 case OPTION_CHANGE_SECTION_VMA:
3434 p->change_vma = what;
3435 p->vma_val = val;
3436 break;
3437 }
3438 }
3439 break;
57938635 3440
252b5132
RH
3441 case OPTION_CHANGE_ADDRESSES:
3442 change_section_address = parse_vma (optarg, "--change-addresses");
3443 change_start = change_section_address;
3444 break;
57938635 3445
252b5132 3446 case OPTION_CHANGE_WARNINGS:
b34976b6 3447 change_warn = TRUE;
252b5132 3448 break;
57938635 3449
252b5132 3450 case OPTION_CHANGE_LEADING_CHAR:
b34976b6 3451 change_leading_char = TRUE;
252b5132 3452 break;
57938635 3453
252b5132 3454 case OPTION_DEBUGGING:
b34976b6 3455 convert_debugging = TRUE;
252b5132 3456 break;
57938635 3457
252b5132
RH
3458 case OPTION_GAP_FILL:
3459 {
3460 bfd_vma gap_fill_vma;
3461
3462 gap_fill_vma = parse_vma (optarg, "--gap-fill");
3463 gap_fill = (bfd_byte) gap_fill_vma;
3464 if ((bfd_vma) gap_fill != gap_fill_vma)
3465 {
3466 char buff[20];
57938635 3467
252b5132 3468 sprintf_vma (buff, gap_fill_vma);
57938635 3469
252b5132
RH
3470 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
3471 buff, gap_fill);
3472 }
b34976b6 3473 gap_fill_set = TRUE;
252b5132
RH
3474 }
3475 break;
57938635 3476
252b5132 3477 case OPTION_NO_CHANGE_WARNINGS:
b34976b6 3478 change_warn = FALSE;
252b5132 3479 break;
57938635 3480
252b5132
RH
3481 case OPTION_PAD_TO:
3482 pad_to = parse_vma (optarg, "--pad-to");
b34976b6 3483 pad_to_set = TRUE;
252b5132 3484 break;
57938635 3485
252b5132 3486 case OPTION_REMOVE_LEADING_CHAR:
b34976b6 3487 remove_leading_char = TRUE;
252b5132 3488 break;
57938635
AM
3489
3490 case OPTION_REDEFINE_SYM:
3491 {
3492 /* Push this redefinition onto redefine_symbol_list. */
3493
3494 int len;
3495 const char *s;
3496 const char *nextarg;
3497 char *source, *target;
3498
3499 s = strchr (optarg, '=');
3500 if (s == NULL)
594ef5db 3501 fatal (_("bad format for %s"), "--redefine-sym");
57938635
AM
3502
3503 len = s - optarg;
3f5e193b 3504 source = (char *) xmalloc (len + 1);
57938635
AM
3505 strncpy (source, optarg, len);
3506 source[len] = '\0';
3507
3508 nextarg = s + 1;
3509 len = strlen (nextarg);
3f5e193b 3510 target = (char *) xmalloc (len + 1);
57938635
AM
3511 strcpy (target, nextarg);
3512
92991082 3513 redefine_list_append ("--redefine-sym", source, target);
57938635
AM
3514
3515 free (source);
3516 free (target);
3517 }
3518 break;
3519
92991082
JT
3520 case OPTION_REDEFINE_SYMS:
3521 add_redefine_syms_file (optarg);
3522 break;
3523
252b5132
RH
3524 case OPTION_SET_SECTION_FLAGS:
3525 {
3526 const char *s;
3527 int len;
3528 char *name;
3529
3530 s = strchr (optarg, '=');
3531 if (s == NULL)
57938635 3532 fatal (_("bad format for %s"), "--set-section-flags");
252b5132
RH
3533
3534 len = s - optarg;
3f5e193b 3535 name = (char *) xmalloc (len + 1);
252b5132
RH
3536 strncpy (name, optarg, len);
3537 name[len] = '\0';
3538
b34976b6 3539 p = find_section_list (name, TRUE);
252b5132 3540
b34976b6 3541 p->set_flags = TRUE;
252b5132
RH
3542 p->flags = parse_flags (s + 1);
3543 }
3544 break;
57938635 3545
594ef5db
NC
3546 case OPTION_RENAME_SECTION:
3547 {
3548 flagword flags;
3bcfb3e4
AM
3549 const char *eq, *fl;
3550 char *old_name;
3551 char *new_name;
594ef5db
NC
3552 unsigned int len;
3553
3bcfb3e4
AM
3554 eq = strchr (optarg, '=');
3555 if (eq == NULL)
594ef5db
NC
3556 fatal (_("bad format for %s"), "--rename-section");
3557
3bcfb3e4 3558 len = eq - optarg;
594ef5db 3559 if (len == 0)
3bcfb3e4 3560 fatal (_("bad format for %s"), "--rename-section");
594ef5db 3561
3f5e193b 3562 old_name = (char *) xmalloc (len + 1);
594ef5db
NC
3563 strncpy (old_name, optarg, len);
3564 old_name[len] = 0;
3565
3bcfb3e4
AM
3566 eq++;
3567 fl = strchr (eq, ',');
3568 if (fl)
594ef5db 3569 {
3bcfb3e4
AM
3570 flags = parse_flags (fl + 1);
3571 len = fl - eq;
594ef5db
NC
3572 }
3573 else
3574 {
594ef5db 3575 flags = -1;
3bcfb3e4 3576 len = strlen (eq);
594ef5db
NC
3577 }
3578
3bcfb3e4
AM
3579 if (len == 0)
3580 fatal (_("bad format for %s"), "--rename-section");
3581
3f5e193b 3582 new_name = (char *) xmalloc (len + 1);
3bcfb3e4
AM
3583 strncpy (new_name, eq, len);
3584 new_name[len] = 0;
3585
594ef5db
NC
3586 add_section_rename (old_name, new_name, flags);
3587 }
3588 break;
3589
252b5132
RH
3590 case OPTION_SET_START:
3591 set_start = parse_vma (optarg, "--set-start");
b34976b6 3592 set_start_set = TRUE;
252b5132 3593 break;
57938635 3594
0af11b59
KH
3595 case OPTION_SREC_LEN:
3596 Chunk = parse_vma (optarg, "--srec-len");
3597 break;
420496c1 3598
0af11b59 3599 case OPTION_SREC_FORCES3:
b34976b6 3600 S3Forced = TRUE;
0af11b59 3601 break;
420496c1 3602
16b2b71c 3603 case OPTION_STRIP_SYMBOLS:
047c9024 3604 add_specific_symbols (optarg, strip_specific_htab);
16b2b71c
NC
3605 break;
3606
bcf32829 3607 case OPTION_STRIP_UNNEEDED_SYMBOLS:
047c9024 3608 add_specific_symbols (optarg, strip_unneeded_htab);
bcf32829
JB
3609 break;
3610
16b2b71c 3611 case OPTION_KEEP_SYMBOLS:
047c9024 3612 add_specific_symbols (optarg, keep_specific_htab);
16b2b71c
NC
3613 break;
3614
d58c2e3a
RS
3615 case OPTION_LOCALIZE_HIDDEN:
3616 localize_hidden = TRUE;
3617 break;
3618
16b2b71c 3619 case OPTION_LOCALIZE_SYMBOLS:
047c9024 3620 add_specific_symbols (optarg, localize_specific_htab);
16b2b71c
NC
3621 break;
3622
0408dee6
DK
3623 case OPTION_LONG_SECTION_NAMES:
3624 if (!strcmp ("enable", optarg))
3625 long_section_names = ENABLE;
3626 else if (!strcmp ("disable", optarg))
3627 long_section_names = DISABLE;
3628 else if (!strcmp ("keep", optarg))
3629 long_section_names = KEEP;
3630 else
3631 fatal (_("unknown long section names option '%s'"), optarg);
3632 break;
3633
7b4a0685 3634 case OPTION_GLOBALIZE_SYMBOLS:
047c9024 3635 add_specific_symbols (optarg, globalize_specific_htab);
7b4a0685
NC
3636 break;
3637
16b2b71c 3638 case OPTION_KEEPGLOBAL_SYMBOLS:
047c9024 3639 add_specific_symbols (optarg, keepglobal_specific_htab);
16b2b71c
NC
3640 break;
3641
3642 case OPTION_WEAKEN_SYMBOLS:
047c9024 3643 add_specific_symbols (optarg, weaken_specific_htab);
16b2b71c
NC
3644 break;
3645
1ae8b3d2 3646 case OPTION_ALT_MACH_CODE:
f9d4ad2a
NC
3647 use_alt_mach_code = strtoul (optarg, NULL, 0);
3648 if (use_alt_mach_code == 0)
3649 fatal (_("unable to parse alternative machine code"));
1ae8b3d2
AO
3650 break;
3651
d7fb0dd2
NC
3652 case OPTION_PREFIX_SYMBOLS:
3653 prefix_symbols_string = optarg;
3654 break;
3655
3656 case OPTION_PREFIX_SECTIONS:
3657 prefix_sections_string = optarg;
3658 break;
3659
3660 case OPTION_PREFIX_ALLOC_SECTIONS:
3661 prefix_alloc_sections_string = optarg;
3662 break;
3663
4087920c
MR
3664 case OPTION_READONLY_TEXT:
3665 bfd_flags_to_set |= WP_TEXT;
3666 bfd_flags_to_clear &= ~WP_TEXT;
3667 break;
3668
3669 case OPTION_WRITABLE_TEXT:
3670 bfd_flags_to_clear |= WP_TEXT;
3671 bfd_flags_to_set &= ~WP_TEXT;
3672 break;
3673
3674 case OPTION_PURE:
3675 bfd_flags_to_set |= D_PAGED;
3676 bfd_flags_to_clear &= ~D_PAGED;
3677 break;
3678
3679 case OPTION_IMPURE:
3680 bfd_flags_to_clear |= D_PAGED;
3681 bfd_flags_to_set &= ~D_PAGED;
3682 break;
3683
d3e52d40
RS
3684 case OPTION_EXTRACT_SYMBOL:
3685 extract_symbol = TRUE;
3686 break;
3687
9e48b4c6
NC
3688 case OPTION_REVERSE_BYTES:
3689 {
3690 int prev = reverse_bytes;
3691
3692 reverse_bytes = atoi (optarg);
3693 if ((reverse_bytes <= 0) || ((reverse_bytes % 2) != 0))
3694 fatal (_("number of bytes to reverse must be positive and even"));
3695
3696 if (prev && prev != reverse_bytes)
3697 non_fatal (_("Warning: ignoring previous --reverse-bytes value of %d"),
3698 prev);
3699 break;
3700 }
3701
92dd4511
L
3702 case OPTION_FILE_ALIGNMENT:
3703 pe_file_alignment = parse_vma (optarg, "--file-alignment");
3704 break;
3705
3706 case OPTION_HEAP:
3707 {
3708 char *end;
3709 pe_heap_reserve = strtoul (optarg, &end, 0);
3710 if (end == optarg
3711 || (*end != '.' && *end != '\0'))
3712 non_fatal (_("%s: invalid reserve value for --heap"),
3713 optarg);
3714 else if (*end != '\0')
3715 {
3716 pe_heap_commit = strtoul (end + 1, &end, 0);
3717 if (*end != '\0')
3718 non_fatal (_("%s: invalid commit value for --heap"),
3719 optarg);
3720 }
3721 }
3722 break;
3723
3724 case OPTION_IMAGE_BASE:
3725 pe_image_base = parse_vma (optarg, "--image-base");
3726 break;
3727
3728 case OPTION_SECTION_ALIGNMENT:
3729 pe_section_alignment = parse_vma (optarg,
3730 "--section-alignment");
3731 break;
3732
3733 case OPTION_SUBSYSTEM:
3734 set_pe_subsystem (optarg);
3735 break;
3736
3737 case OPTION_STACK:
3738 {
3739 char *end;
3740 pe_stack_reserve = strtoul (optarg, &end, 0);
3741 if (end == optarg
3742 || (*end != '.' && *end != '\0'))
3743 non_fatal (_("%s: invalid reserve value for --stack"),
3744 optarg);
3745 else if (*end != '\0')
3746 {
3747 pe_stack_commit = strtoul (end + 1, &end, 0);
3748 if (*end != '\0')
3749 non_fatal (_("%s: invalid commit value for --stack"),
3750 optarg);
3751 }
3752 }
3753 break;
3754
252b5132 3755 case 0:
2593f09a
NC
3756 /* We've been given a long option. */
3757 break;
57938635 3758
8b53311e 3759 case 'H':
252b5132
RH
3760 case 'h':
3761 copy_usage (stdout, 0);
57938635 3762
252b5132
RH
3763 default:
3764 copy_usage (stderr, 1);
3765 }
3766 }
3767
7c29036b
NC
3768 if (formats_info)
3769 {
3770 display_info ();
3771 return 0;
3772 }
c1c0eb9e 3773
252b5132
RH
3774 if (show_version)
3775 print_version ("objcopy");
3776
3777 if (copy_byte >= interleave)
3778 fatal (_("byte number must be less than interleave"));
3779
3780 if (optind == argc || optind + 2 < argc)
3781 copy_usage (stderr, 1);
3782
3783 input_filename = argv[optind];
3784 if (optind + 1 < argc)
3785 output_filename = argv[optind + 1];
3786
3787 /* Default is to strip no symbols. */
3788 if (strip_symbols == STRIP_UNDEF && discard_locals == LOCALS_UNDEF)
3789 strip_symbols = STRIP_NONE;
3790
d3ba0551 3791 if (output_target == NULL)
252b5132
RH
3792 output_target = input_target;
3793
92dd4511
L
3794 /* Convert input EFI target to PEI target. */
3795 if (input_target != NULL
3796 && strncmp (input_target, "efi-", 4) == 0)
3797 {
3798 char *efi;
3799
3800 efi = xstrdup (output_target + 4);
3801 if (strncmp (efi, "bsdrv-", 6) == 0
3802 || strncmp (efi, "rtdrv-", 6) == 0)
3803 efi += 2;
3804 else if (strncmp (efi, "app-", 4) != 0)
3805 fatal (_("unknown input EFI target: %s"), input_target);
3806
3807 input_target = efi;
3808 convert_efi_target (efi);
3809 }
3810
3811 /* Convert output EFI target to PEI target. */
3812 if (output_target != NULL
3813 && strncmp (output_target, "efi-", 4) == 0)
3814 {
3815 char *efi;
3816
3817 efi = xstrdup (output_target + 4);
3818 if (strncmp (efi, "app-", 4) == 0)
3819 {
3820 if (pe_subsystem == -1)
3821 pe_subsystem = IMAGE_SUBSYSTEM_EFI_APPLICATION;
3822 }
3823 else if (strncmp (efi, "bsdrv-", 6) == 0)
3824 {
3825 if (pe_subsystem == -1)
3826 pe_subsystem = IMAGE_SUBSYSTEM_EFI_BOOT_SERVICE_DRIVER;
3827 efi += 2;
3828 }
3829 else if (strncmp (efi, "rtdrv-", 6) == 0)
3830 {
3831 if (pe_subsystem == -1)
3832 pe_subsystem = IMAGE_SUBSYSTEM_EFI_RUNTIME_DRIVER;
3833 efi += 2;
3834 }
3835 else
3836 fatal (_("unknown output EFI target: %s"), output_target);
3837
3838 if (pe_file_alignment == (bfd_vma) -1)
3839 pe_file_alignment = PE_DEF_FILE_ALIGNMENT;
3840 if (pe_section_alignment == (bfd_vma) -1)
3841 pe_section_alignment = PE_DEF_SECTION_ALIGNMENT;
3842
3843 output_target = efi;
3844 convert_efi_target (efi);
3845 }
3846
43a0748c
NC
3847 if (preserve_dates)
3848 if (stat (input_filename, & statbuf) < 0)
f24ddbdd
NC
3849 fatal (_("warning: could not locate '%s'. System error message: %s"),
3850 input_filename, strerror (errno));
43a0748c 3851
0fcdcb91 3852 /* If there is no destination file, or the source and destination files
d3ba0551
AM
3853 are the same, then create a temp and rename the result into the input. */
3854 if (output_filename == NULL || strcmp (input_filename, output_filename) == 0)
12f498a7 3855 tmpname = make_tempname (input_filename);
252b5132 3856 else
12f498a7 3857 tmpname = output_filename;
c1c0eb9e 3858
12f498a7
NS
3859 if (tmpname == NULL)
3860 fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"),
3861 input_filename, strerror (errno));
594ef5db 3862
8b31b6c4 3863 copy_file (input_filename, tmpname, input_target, output_target, input_arch);
12f498a7
NS
3864 if (status == 0)
3865 {
3866 if (preserve_dates)
3867 set_times (tmpname, &statbuf);
3868 if (tmpname != output_filename)
92fac5ec
L
3869 status = (smart_rename (tmpname, input_filename,
3870 preserve_dates) != 0);
252b5132 3871 }
12f498a7
NS
3872 else
3873 unlink_if_ordinary (tmpname);
252b5132
RH
3874
3875 if (change_warn)
3876 {
3877 for (p = change_sections; p != NULL; p = p->next)
3878 {
3879 if (! p->used)
3880 {
3881 if (p->change_vma != CHANGE_IGNORE)
3882 {
3883 char buff [20];
3884
3885 sprintf_vma (buff, p->vma_val);
57938635 3886
252b5132 3887 /* xgettext:c-format */
57938635
AM
3888 non_fatal (_("%s %s%c0x%s never used"),
3889 "--change-section-vma",
252b5132
RH
3890 p->name,
3891 p->change_vma == CHANGE_SET ? '=' : '+',
3892 buff);
3893 }
57938635 3894
252b5132
RH
3895 if (p->change_lma != CHANGE_IGNORE)
3896 {
3897 char buff [20];
3898
3899 sprintf_vma (buff, p->lma_val);
57938635 3900
252b5132 3901 /* xgettext:c-format */
57938635
AM
3902 non_fatal (_("%s %s%c0x%s never used"),
3903 "--change-section-lma",
252b5132
RH
3904 p->name,
3905 p->change_lma == CHANGE_SET ? '=' : '+',
3906 buff);
3907 }
3908 }
3909 }
3910 }
3911
3912 return 0;
3913}
3914
3915int
84e2f313 3916main (int argc, char *argv[])
252b5132
RH
3917{
3918#if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
3919 setlocale (LC_MESSAGES, "");
3882b010
L
3920#endif
3921#if defined (HAVE_SETLOCALE)
3922 setlocale (LC_CTYPE, "");
252b5132
RH
3923#endif
3924 bindtextdomain (PACKAGE, LOCALEDIR);
3925 textdomain (PACKAGE);
3926
3927 program_name = argv[0];
3928 xmalloc_set_program_name (program_name);
3929
3930 START_PROGRESS (program_name, 0);
3931
869b9d07
MM
3932 expandargv (&argc, &argv);
3933
252b5132
RH
3934 strip_symbols = STRIP_UNDEF;
3935 discard_locals = LOCALS_UNDEF;
3936
3937 bfd_init ();
3938 set_default_bfd_target ();
3939
3940 if (is_strip < 0)
3941 {
3942 int i = strlen (program_name);
5af11cab
AM
3943#ifdef HAVE_DOS_BASED_FILE_SYSTEM
3944 /* Drop the .exe suffix, if any. */
3945 if (i > 4 && FILENAME_CMP (program_name + i - 4, ".exe") == 0)
3946 {
3947 i -= 4;
3948 program_name[i] = '\0';
3949 }
3950#endif
3951 is_strip = (i >= 5 && FILENAME_CMP (program_name + i - 5, "strip") == 0);
252b5132
RH
3952 }
3953
047c9024
NC
3954 create_symbol_htabs ();
3955
252b5132
RH
3956 if (is_strip)
3957 strip_main (argc, argv);
3958 else
3959 copy_main (argc, argv);
3960
3961 END_PROGRESS (program_name);
3962
3963 return status;
3964}
This page took 0.665282 seconds and 4 git commands to generate.