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