1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 98, 1999
3 Free Software Foundation, Inc.
5 This file is part of GNU Binutils.
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License as published by
9 the Free Software Foundation; either version 2 of the License, or
10 (at your option) any later version.
12 This program is distributed in the hope that it will be useful,
13 but WITHOUT ANY WARRANTY; without even the implied warranty of
14 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 GNU General Public License for more details.
17 You should have received a copy of the GNU General Public License
18 along with this program; if not, write to the Free Software
19 Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
26 #include "libiberty.h"
30 /* A list of symbols to explicitly strip out, or to keep. A linked
31 list is good enough for a small number from the command line, but
32 this will slow things down a lot if many symbols are being
41 static void copy_usage
PARAMS ((FILE *, int));
42 static void strip_usage
PARAMS ((FILE *, int));
43 static flagword parse_flags
PARAMS ((const char *));
44 static struct section_list
*find_section_list
PARAMS ((const char *, boolean
));
45 static void setup_section
PARAMS ((bfd
*, asection
*, PTR
));
46 static void copy_section
PARAMS ((bfd
*, asection
*, PTR
));
47 static void get_sections
PARAMS ((bfd
*, asection
*, PTR
));
48 static int compare_section_lma
PARAMS ((const PTR
, const PTR
));
49 static void add_specific_symbol
PARAMS ((const char *, struct symlist
**));
50 static boolean is_specified_symbol
PARAMS ((const char *, struct symlist
*));
51 static boolean is_strip_section
PARAMS ((bfd
*, asection
*));
52 static unsigned int filter_symbols
53 PARAMS ((bfd
*, bfd
*, asymbol
**, asymbol
**, long));
54 static void mark_symbols_used_in_relocations
PARAMS ((bfd
*, asection
*, PTR
));
55 static void filter_bytes
PARAMS ((char *, bfd_size_type
*));
56 static boolean write_debugging_info
PARAMS ((bfd
*, PTR
, long *, asymbol
***));
57 static void copy_object
PARAMS ((bfd
*, bfd
*));
58 static void copy_archive
PARAMS ((bfd
*, bfd
*, const char *));
60 PARAMS ((const char *, const char *, const char *, const char *));
61 static int strip_main
PARAMS ((int, char **));
62 static int copy_main
PARAMS ((int, char **));
64 #define RETURN_NONFATAL(s) {bfd_nonfatal (s); status = 1; return;}
66 static asymbol
**isympp
= NULL
; /* Input symbols */
67 static asymbol
**osympp
= NULL
; /* Output symbols that survive stripping */
69 /* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes. */
70 static int copy_byte
= -1;
71 static int interleave
= 4;
73 static boolean verbose
; /* Print file and target names. */
74 static boolean preserve_dates
; /* Preserve input file timestamp. */
75 static int status
= 0; /* Exit status. */
80 STRIP_NONE
, /* don't strip */
81 STRIP_DEBUG
, /* strip all debugger symbols */
82 STRIP_UNNEEDED
, /* strip unnecessary symbols */
83 STRIP_ALL
/* strip all symbols */
86 /* Which symbols to remove. */
87 static enum strip_action strip_symbols
;
92 LOCALS_START_L
, /* discard locals starting with L */
93 LOCALS_ALL
/* discard all locals */
96 /* Which local symbols to remove. Overrides STRIP_ALL. */
97 static enum locals_action discard_locals
;
99 /* What kind of change to perform. */
107 /* Structure used to hold lists of sections and actions to take. */
110 struct section_list
* next
; /* Next section to change. */
111 const char * name
; /* Section name. */
112 boolean used
; /* Whether this entry was used. */
113 boolean remove
; /* Whether to remove this section. */
114 boolean copy
; /* Whether to copy this section. */
115 enum change_action change_vma
;/* Whether to change or set VMA. */
116 bfd_vma vma_val
; /* Amount to change by or set to. */
117 enum change_action change_lma
;/* Whether to change or set LMA. */
118 bfd_vma lma_val
; /* Amount to change by or set to. */
119 boolean set_flags
; /* Whether to set the section flags. */
120 flagword flags
; /* What to set the section flags to. */
123 static struct section_list
*change_sections
;
124 static boolean sections_removed
;
125 static boolean sections_copied
;
127 /* Changes to the start address. */
128 static bfd_vma change_start
= 0;
129 static boolean set_start_set
= false;
130 static bfd_vma set_start
;
132 /* Changes to section addresses. */
133 static bfd_vma change_section_address
= 0;
135 /* Filling gaps between sections. */
136 static boolean gap_fill_set
= false;
137 static bfd_byte gap_fill
= 0;
139 /* Pad to a given address. */
140 static boolean pad_to_set
= false;
141 static bfd_vma pad_to
;
143 /* List of sections to add. */
147 /* Next section to add. */
148 struct section_add
*next
;
149 /* Name of section to add. */
151 /* Name of file holding section contents. */
152 const char *filename
;
155 /* Contents of file. */
157 /* BFD section, after it has been added. */
161 static struct section_add
*add_sections
;
163 /* Whether to convert debugging information. */
165 static boolean convert_debugging
= false;
167 /* Whether to change the leading character in symbol names. */
169 static boolean change_leading_char
= false;
171 /* Whether to remove the leading character from global symbol names. */
173 static boolean remove_leading_char
= false;
175 /* List of symbols to strip, keep, localize, and weaken. */
177 static struct symlist
*strip_specific_list
= NULL
;
178 static struct symlist
*keep_specific_list
= NULL
;
179 static struct symlist
*localize_specific_list
= NULL
;
180 static struct symlist
*weaken_specific_list
= NULL
;
182 /* If this is true, we weaken global symbols (set BSF_WEAK). */
184 static boolean weaken
= false;
186 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
188 #define OPTION_ADD_SECTION 150
189 #define OPTION_CHANGE_ADDRESSES (OPTION_ADD_SECTION + 1)
190 #define OPTION_CHANGE_LEADING_CHAR (OPTION_CHANGE_ADDRESSES + 1)
191 #define OPTION_CHANGE_START (OPTION_CHANGE_LEADING_CHAR + 1)
192 #define OPTION_CHANGE_SECTION_ADDRESS (OPTION_CHANGE_START + 1)
193 #define OPTION_CHANGE_SECTION_LMA (OPTION_CHANGE_SECTION_ADDRESS + 1)
194 #define OPTION_CHANGE_SECTION_VMA (OPTION_CHANGE_SECTION_LMA + 1)
195 #define OPTION_CHANGE_WARNINGS (OPTION_CHANGE_SECTION_VMA + 1)
196 #define OPTION_DEBUGGING (OPTION_CHANGE_WARNINGS + 1)
197 #define OPTION_GAP_FILL (OPTION_DEBUGGING + 1)
198 #define OPTION_NO_CHANGE_WARNINGS (OPTION_GAP_FILL + 1)
199 #define OPTION_PAD_TO (OPTION_NO_CHANGE_WARNINGS + 1)
200 #define OPTION_REMOVE_LEADING_CHAR (OPTION_PAD_TO + 1)
201 #define OPTION_SET_SECTION_FLAGS (OPTION_REMOVE_LEADING_CHAR + 1)
202 #define OPTION_SET_START (OPTION_SET_SECTION_FLAGS + 1)
203 #define OPTION_STRIP_UNNEEDED (OPTION_SET_START + 1)
204 #define OPTION_WEAKEN (OPTION_STRIP_UNNEEDED + 1)
206 /* Options to handle if running as "strip". */
208 static struct option strip_options
[] =
210 {"discard-all", no_argument
, 0, 'x'},
211 {"discard-locals", no_argument
, 0, 'X'},
212 {"format", required_argument
, 0, 'F'}, /* Obsolete */
213 {"help", no_argument
, 0, 'h'},
214 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
215 {"input-target", required_argument
, 0, 'I'},
216 {"keep-symbol", required_argument
, 0, 'K'},
217 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
218 {"output-target", required_argument
, 0, 'O'},
219 {"preserve-dates", no_argument
, 0, 'p'},
220 {"remove-section", required_argument
, 0, 'R'},
221 {"strip-all", no_argument
, 0, 's'},
222 {"strip-debug", no_argument
, 0, 'S'},
223 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
224 {"strip-symbol", required_argument
, 0, 'N'},
225 {"target", required_argument
, 0, 'F'},
226 {"verbose", no_argument
, 0, 'v'},
227 {"version", no_argument
, 0, 'V'},
228 {0, no_argument
, 0, 0}
231 /* Options to handle if running as "objcopy". */
233 static struct option copy_options
[] =
235 {"add-section", required_argument
, 0, OPTION_ADD_SECTION
},
236 {"adjust-start", required_argument
, 0, OPTION_CHANGE_START
},
237 {"adjust-vma", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
238 {"adjust-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
239 {"adjust-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
240 {"byte", required_argument
, 0, 'b'},
241 {"change-addresses", required_argument
, 0, OPTION_CHANGE_ADDRESSES
},
242 {"change-leading-char", no_argument
, 0, OPTION_CHANGE_LEADING_CHAR
},
243 {"change-section-address", required_argument
, 0, OPTION_CHANGE_SECTION_ADDRESS
},
244 {"change-section-lma", required_argument
, 0, OPTION_CHANGE_SECTION_LMA
},
245 {"change-section-vma", required_argument
, 0, OPTION_CHANGE_SECTION_VMA
},
246 {"change-start", required_argument
, 0, OPTION_CHANGE_START
},
247 {"change-warnings", no_argument
, 0, OPTION_CHANGE_WARNINGS
},
248 {"debugging", no_argument
, 0, OPTION_DEBUGGING
},
249 {"discard-all", no_argument
, 0, 'x'},
250 {"discard-locals", no_argument
, 0, 'X'},
251 {"only-section", required_argument
, 0, 'j'},
252 {"format", required_argument
, 0, 'F'}, /* Obsolete */
253 {"gap-fill", required_argument
, 0, OPTION_GAP_FILL
},
254 {"help", no_argument
, 0, 'h'},
255 {"input-format", required_argument
, 0, 'I'}, /* Obsolete */
256 {"input-target", required_argument
, 0, 'I'},
257 {"interleave", required_argument
, 0, 'i'},
258 {"keep-symbol", required_argument
, 0, 'K'},
259 {"no-adjust-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
260 {"no-change-warnings", no_argument
, 0, OPTION_NO_CHANGE_WARNINGS
},
261 {"output-format", required_argument
, 0, 'O'}, /* Obsolete */
262 {"output-target", required_argument
, 0, 'O'},
263 {"pad-to", required_argument
, 0, OPTION_PAD_TO
},
264 {"preserve-dates", no_argument
, 0, 'p'},
265 {"localize-symbol", required_argument
, 0, 'L'},
266 {"remove-leading-char", no_argument
, 0, OPTION_REMOVE_LEADING_CHAR
},
267 {"remove-section", required_argument
, 0, 'R'},
268 {"set-section-flags", required_argument
, 0, OPTION_SET_SECTION_FLAGS
},
269 {"set-start", required_argument
, 0, OPTION_SET_START
},
270 {"strip-all", no_argument
, 0, 'S'},
271 {"strip-debug", no_argument
, 0, 'g'},
272 {"strip-unneeded", no_argument
, 0, OPTION_STRIP_UNNEEDED
},
273 {"strip-symbol", required_argument
, 0, 'N'},
274 {"target", required_argument
, 0, 'F'},
275 {"verbose", no_argument
, 0, 'v'},
276 {"version", no_argument
, 0, 'V'},
277 {"weaken", no_argument
, 0, OPTION_WEAKEN
},
278 {"weaken-symbol", required_argument
, 0, 'W'},
279 {0, no_argument
, 0, 0}
283 extern char *program_name
;
285 /* This flag distinguishes between strip and objcopy:
286 1 means this is 'strip'; 0 means this is 'objcopy'.
287 -1 means if we should use argv[0] to decide. */
292 copy_usage (stream
, exit_status
)
296 fprintf (stream
, _("\
297 Usage: %s [-vVSpgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-b byte]\n\
298 [-j section] [-R section]\n\
299 [-i interleave] [--interleave=interleave] [--byte=byte]\n\
300 [--input-target=bfdname] [--output-target=bfdname] [--target=bfdname]\n\
301 [--strip-all] [--strip-debug] [--strip-unneeded] [--discard-all]\n\
302 [--discard-locals] [--debugging]\n\
303 [--only-section=section] [--remove-section=section]\n"),
305 fprintf (stream
, _("\
306 [--gap-fill=val] [--pad-to=address] [--preserve-dates]\n\
307 [--set-start=val] \n\
308 [--change-start=incr] [--change-addresses=incr] \n\
309 (--adjust-start and --adjust-vma are aliases for these two) \n\
310 [--change-section-address=section{=,+,-}val]\n\
311 (--adjust-section-vma is an alias for --change-section-address)\n\
312 [--change-section-lma=section{=,+,-}val]\n\
313 [--change-section-vma=section{=,+,-}val]\n\
314 [--adjust-warnings] [--no-adjust-warnings]\n\
315 [--change-warnings] [--no-change-warnings]\n\
316 [--set-section-flags=section=flags] [--add-section=sectionname=filename]\n\
317 [--keep-symbol symbol] [-K symbol] [--strip-symbol symbol] [-N symbol]\n\
318 [--localize-symbol symbol] [-L symbol] [--weaken-symbol symbol]\n\
319 [-W symbol] [--change-leading-char] [--remove-leading-char] [--weaken]\n\
320 [--verbose] [--version] [--help] in-file [out-file]\n"));
321 list_supported_targets (program_name
, stream
);
322 if (exit_status
== 0)
323 fprintf (stream
, _("Report bugs to bug-gnu-utils@gnu.org\n"));
328 strip_usage (stream
, exit_status
)
332 fprintf (stream
, _("\
333 Usage: %s [-vVsSpgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-R section]\n\
334 [--input-target=bfdname] [--output-target=bfdname] [--target=bfdname]\n\
335 [--strip-all] [--strip-debug] [--strip-unneeded] [--discard-all]\n\
336 [--discard-locals] [--keep-symbol symbol] [-K symbol]\n\
337 [--strip-symbol symbol] [-N symbol] [--remove-section=section]\n\
338 [-o file] [--preserve-dates] [--verbose] [--version] [--help] file...\n"),
340 list_supported_targets (program_name
, stream
);
341 if (exit_status
== 0)
342 fprintf (stream
, _("Report bugs to bug-gnu-utils@gnu.org\n"));
346 /* Parse section flags into a flagword, with a fatal error if the
347 string can't be parsed. */
361 snext
= strchr (s
, ',');
371 #define PARSE_FLAG(fname,fval) \
372 else if (strncasecmp (fname, s, len) == 0) ret |= fval
373 PARSE_FLAG ("alloc", SEC_ALLOC
);
374 PARSE_FLAG ("load", SEC_LOAD
);
375 PARSE_FLAG ("noload", SEC_NEVER_LOAD
);
376 PARSE_FLAG ("readonly", SEC_READONLY
);
377 PARSE_FLAG ("debug", SEC_DEBUGGING
);
378 PARSE_FLAG ("code", SEC_CODE
);
379 PARSE_FLAG ("data", SEC_DATA
);
380 PARSE_FLAG ("rom", SEC_ROM
);
381 PARSE_FLAG ("share", SEC_SHARED
);
382 PARSE_FLAG ("contents", SEC_HAS_CONTENTS
);
388 copy
= xmalloc (len
+ 1);
389 strncpy (copy
, s
, len
);
391 non_fatal (_("unrecognized section flag `%s'"), copy
);
392 fatal (_("supported flags: alloc, load, noload, readonly, debug, code, data, rom, share, contents"));
402 /* Find and optionally add an entry in the change_sections list. */
404 static struct section_list
*
405 find_section_list (name
, add
)
409 register struct section_list
*p
;
411 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
412 if (strcmp (p
->name
, name
) == 0)
418 p
= (struct section_list
*) xmalloc (sizeof (struct section_list
));
423 p
->change_vma
= CHANGE_IGNORE
;
424 p
->change_lma
= CHANGE_IGNORE
;
427 p
->set_flags
= false;
430 p
->next
= change_sections
;
436 /* Add a symbol to strip_specific_list. */
439 add_specific_symbol (name
, list
)
441 struct symlist
**list
;
443 struct symlist
*tmp_list
;
445 tmp_list
= (struct symlist
*) xmalloc (sizeof (struct symlist
));
446 tmp_list
->name
= name
;
447 tmp_list
->next
= *list
;
451 /* See whether a symbol should be stripped or kept based on
452 strip_specific_list and keep_symbols. */
455 is_specified_symbol (name
, list
)
457 struct symlist
*list
;
459 struct symlist
*tmp_list
;
461 for (tmp_list
= list
; tmp_list
; tmp_list
= tmp_list
->next
)
463 if (strcmp (name
, tmp_list
->name
) == 0)
469 /* See if a section is being removed. */
472 is_strip_section (abfd
, sec
)
473 bfd
*abfd ATTRIBUTE_UNUSED
;
476 struct section_list
*p
;
478 if ((bfd_get_section_flags (abfd
, sec
) & SEC_DEBUGGING
) != 0
479 && (strip_symbols
== STRIP_DEBUG
480 || strip_symbols
== STRIP_UNNEEDED
481 || strip_symbols
== STRIP_ALL
482 || discard_locals
== LOCALS_ALL
483 || convert_debugging
))
486 if (! sections_removed
&& ! sections_copied
)
489 p
= find_section_list (bfd_get_section_name (abfd
, sec
), false);
490 if (sections_removed
&& p
!= NULL
&& p
->remove
)
492 if (sections_copied
&& (p
== NULL
|| ! p
->copy
))
497 /* Choose which symbol entries to copy; put the result in OSYMS.
498 We don't copy in place, because that confuses the relocs.
499 Return the number of symbols to print. */
502 filter_symbols (abfd
, obfd
, osyms
, isyms
, symcount
)
505 asymbol
**osyms
, **isyms
;
508 register asymbol
**from
= isyms
, **to
= osyms
;
509 long src_count
= 0, dst_count
= 0;
511 for (; src_count
< symcount
; src_count
++)
513 asymbol
*sym
= from
[src_count
];
514 flagword flags
= sym
->flags
;
515 const char *name
= bfd_asymbol_name (sym
);
518 if (change_leading_char
519 && (bfd_get_symbol_leading_char (abfd
)
520 != bfd_get_symbol_leading_char (obfd
))
521 && (bfd_get_symbol_leading_char (abfd
) == '\0'
522 || (name
[0] == bfd_get_symbol_leading_char (abfd
))))
524 if (bfd_get_symbol_leading_char (obfd
) == '\0')
525 name
= bfd_asymbol_name (sym
) = name
+ 1;
530 n
= xmalloc (strlen (name
) + 2);
531 n
[0] = bfd_get_symbol_leading_char (obfd
);
532 if (bfd_get_symbol_leading_char (abfd
) == '\0')
533 strcpy (n
+ 1, name
);
535 strcpy (n
+ 1, name
+ 1);
536 name
= bfd_asymbol_name (sym
) = n
;
540 if (remove_leading_char
541 && ((flags
& BSF_GLOBAL
) != 0
542 || (flags
& BSF_WEAK
) != 0
543 || bfd_is_und_section (bfd_get_section (sym
))
544 || bfd_is_com_section (bfd_get_section (sym
)))
545 && name
[0] == bfd_get_symbol_leading_char (abfd
))
546 name
= bfd_asymbol_name (sym
) = name
+ 1;
548 if (strip_symbols
== STRIP_ALL
)
550 else if ((flags
& BSF_KEEP
) != 0 /* Used in relocation. */
551 || ((flags
& BSF_SECTION_SYM
) != 0
552 && ((*bfd_get_section (sym
)->symbol_ptr_ptr
)->flags
555 else if ((flags
& BSF_GLOBAL
) != 0 /* Global symbol. */
556 || (flags
& BSF_WEAK
) != 0
557 || bfd_is_und_section (bfd_get_section (sym
))
558 || bfd_is_com_section (bfd_get_section (sym
)))
559 keep
= strip_symbols
!= STRIP_UNNEEDED
;
560 else if ((flags
& BSF_DEBUGGING
) != 0) /* Debugging symbol. */
561 keep
= (strip_symbols
!= STRIP_DEBUG
562 && strip_symbols
!= STRIP_UNNEEDED
563 && ! convert_debugging
);
564 else /* Local symbol. */
565 keep
= (strip_symbols
!= STRIP_UNNEEDED
566 && (discard_locals
!= LOCALS_ALL
567 && (discard_locals
!= LOCALS_START_L
568 || ! bfd_is_local_label (abfd
, sym
))));
570 if (keep
&& is_specified_symbol (name
, strip_specific_list
))
572 if (!keep
&& is_specified_symbol (name
, keep_specific_list
))
574 if (keep
&& is_strip_section (abfd
, bfd_get_section (sym
)))
577 if (keep
&& (flags
& BSF_GLOBAL
) != 0
578 && (weaken
|| is_specified_symbol (name
, weaken_specific_list
)))
580 sym
->flags
&=~ BSF_GLOBAL
;
581 sym
->flags
|= BSF_WEAK
;
583 if (keep
&& (flags
& (BSF_GLOBAL
| BSF_WEAK
))
584 && is_specified_symbol (name
, localize_specific_list
))
586 sym
->flags
&= ~(BSF_GLOBAL
| BSF_WEAK
);
587 sym
->flags
|= BSF_LOCAL
;
591 to
[dst_count
++] = sym
;
594 to
[dst_count
] = NULL
;
599 /* Keep only every `copy_byte'th byte in MEMHUNK, which is *SIZE bytes long.
603 filter_bytes (memhunk
, size
)
607 char *from
= memhunk
+ copy_byte
, *to
= memhunk
, *end
= memhunk
+ *size
;
609 for (; from
< end
; from
+= interleave
)
611 if (*size
% interleave
> (bfd_size_type
) copy_byte
)
612 *size
= (*size
/ interleave
) + 1;
617 /* Copy object file IBFD onto OBFD. */
620 copy_object (ibfd
, obfd
)
626 asection
**osections
= NULL
;
627 bfd_size_type
*gaps
= NULL
;
628 bfd_size_type max_gap
= 0;
633 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
634 RETURN_NONFATAL (bfd_get_filename (obfd
));
637 printf (_("copy from %s(%s) to %s(%s)\n"),
638 bfd_get_filename (ibfd
), bfd_get_target (ibfd
),
639 bfd_get_filename (obfd
), bfd_get_target (obfd
));
644 start
= bfd_get_start_address (ibfd
);
645 start
+= change_start
;
647 if (!bfd_set_start_address (obfd
, start
)
648 || !bfd_set_file_flags (obfd
,
649 (bfd_get_file_flags (ibfd
)
650 & bfd_applicable_file_flags (obfd
))))
651 RETURN_NONFATAL (bfd_get_filename (ibfd
));
653 /* Copy architecture of input file to output file */
654 if (!bfd_set_arch_mach (obfd
, bfd_get_arch (ibfd
),
655 bfd_get_mach (ibfd
)))
656 non_fatal (_("Warning: Output file cannot represent architecture %s"),
657 bfd_printable_arch_mach (bfd_get_arch (ibfd
),
658 bfd_get_mach (ibfd
)));
660 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
661 RETURN_NONFATAL (bfd_get_filename (ibfd
));
666 if (osympp
!= isympp
)
669 /* BFD mandates that all output sections be created and sizes set before
670 any output is done. Thus, we traverse all sections multiple times. */
671 bfd_map_over_sections (ibfd
, setup_section
, (void *) obfd
);
673 if (add_sections
!= NULL
)
675 struct section_add
*padd
;
676 struct section_list
*pset
;
678 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
680 padd
->section
= bfd_make_section (obfd
, padd
->name
);
681 if (padd
->section
== NULL
)
683 non_fatal (_("can't create section `%s': %s"),
684 padd
->name
, bfd_errmsg (bfd_get_error ()));
692 if (! bfd_set_section_size (obfd
, padd
->section
, padd
->size
))
693 RETURN_NONFATAL (bfd_get_filename (obfd
));
695 pset
= find_section_list (padd
->name
, false);
699 if (pset
!= NULL
&& pset
->set_flags
)
700 flags
= pset
->flags
| SEC_HAS_CONTENTS
;
702 flags
= SEC_HAS_CONTENTS
| SEC_READONLY
| SEC_DATA
;
704 if (! bfd_set_section_flags (obfd
, padd
->section
, flags
))
705 RETURN_NONFATAL (bfd_get_filename (obfd
));
709 if (pset
->change_vma
!= CHANGE_IGNORE
)
710 if (! bfd_set_section_vma (obfd
, padd
->section
, pset
->vma_val
))
711 RETURN_NONFATAL (bfd_get_filename (obfd
));
713 if (pset
->change_lma
!= CHANGE_IGNORE
)
715 padd
->section
->lma
= pset
->lma_val
;
717 if (! bfd_set_section_alignment
718 (obfd
, padd
->section
,
719 bfd_section_alignment (obfd
, padd
->section
)))
720 RETURN_NONFATAL (bfd_get_filename (obfd
));
727 if (gap_fill_set
|| pad_to_set
)
732 /* We must fill in gaps between the sections and/or we must pad
733 the last section to a specified address. We do this by
734 grabbing a list of the sections, sorting them by VMA, and
735 increasing the section sizes as required to fill the gaps.
736 We write out the gap contents below. */
738 c
= bfd_count_sections (obfd
);
739 osections
= (asection
**) xmalloc (c
* sizeof (asection
*));
741 bfd_map_over_sections (obfd
, get_sections
, (void *) &set
);
743 qsort (osections
, c
, sizeof (asection
*), compare_section_lma
);
745 gaps
= (bfd_size_type
*) xmalloc (c
* sizeof (bfd_size_type
));
746 memset (gaps
, 0, c
* sizeof (bfd_size_type
));
750 for (i
= 0; i
< c
- 1; i
++)
754 bfd_vma gap_start
, gap_stop
;
756 flags
= bfd_get_section_flags (obfd
, osections
[i
]);
757 if ((flags
& SEC_HAS_CONTENTS
) == 0
758 || (flags
& SEC_LOAD
) == 0)
761 size
= bfd_section_size (obfd
, osections
[i
]);
762 gap_start
= bfd_section_lma (obfd
, osections
[i
]) + size
;
763 gap_stop
= bfd_section_lma (obfd
, osections
[i
+ 1]);
764 if (gap_start
< gap_stop
)
766 if (! bfd_set_section_size (obfd
, osections
[i
],
767 size
+ (gap_stop
- gap_start
)))
769 non_fatal (_("Can't fill gap after %s: %s"),
770 bfd_get_section_name (obfd
, osections
[i
]),
771 bfd_errmsg (bfd_get_error ()));
775 gaps
[i
] = gap_stop
- gap_start
;
776 if (max_gap
< gap_stop
- gap_start
)
777 max_gap
= gap_stop
- gap_start
;
787 lma
= bfd_section_lma (obfd
, osections
[c
- 1]);
788 size
= bfd_section_size (obfd
, osections
[c
- 1]);
789 if (lma
+ size
< pad_to
)
791 if (! bfd_set_section_size (obfd
, osections
[c
- 1],
794 non_fatal (_("Can't add padding to %s: %s"),
795 bfd_get_section_name (obfd
, osections
[c
- 1]),
796 bfd_errmsg (bfd_get_error ()));
801 gaps
[c
- 1] = pad_to
- (lma
+ size
);
802 if (max_gap
< pad_to
- (lma
+ size
))
803 max_gap
= pad_to
- (lma
+ size
);
809 /* Symbol filtering must happen after the output sections have
810 been created, but before their contents are set. */
812 symsize
= bfd_get_symtab_upper_bound (ibfd
);
814 RETURN_NONFATAL (bfd_get_filename (ibfd
));
816 osympp
= isympp
= (asymbol
**) xmalloc (symsize
);
817 symcount
= bfd_canonicalize_symtab (ibfd
, isympp
);
819 RETURN_NONFATAL (bfd_get_filename (ibfd
));
821 if (convert_debugging
)
822 dhandle
= read_debugging_info (ibfd
, isympp
, symcount
);
824 if (strip_symbols
== STRIP_DEBUG
825 || strip_symbols
== STRIP_ALL
826 || strip_symbols
== STRIP_UNNEEDED
827 || discard_locals
!= LOCALS_UNDEF
828 || strip_specific_list
!= NULL
829 || keep_specific_list
!= NULL
830 || localize_specific_list
!= NULL
831 || weaken_specific_list
!= NULL
835 || change_leading_char
836 || remove_leading_char
839 /* Mark symbols used in output relocations so that they
840 are kept, even if they are local labels or static symbols.
842 Note we iterate over the input sections examining their
843 relocations since the relocations for the output sections
844 haven't been set yet. mark_symbols_used_in_relocations will
845 ignore input sections which have no corresponding output
847 if (strip_symbols
!= STRIP_ALL
)
848 bfd_map_over_sections (ibfd
,
849 mark_symbols_used_in_relocations
,
851 osympp
= (asymbol
**) xmalloc ((symcount
+ 1) * sizeof (asymbol
*));
852 symcount
= filter_symbols (ibfd
, obfd
, osympp
, isympp
, symcount
);
855 if (convert_debugging
&& dhandle
!= NULL
)
857 if (! write_debugging_info (obfd
, dhandle
, &symcount
, &osympp
))
864 bfd_set_symtab (obfd
, osympp
, symcount
);
866 /* This has to happen after the symbol table has been set. */
867 bfd_map_over_sections (ibfd
, copy_section
, (void *) obfd
);
869 if (add_sections
!= NULL
)
871 struct section_add
*padd
;
873 for (padd
= add_sections
; padd
!= NULL
; padd
= padd
->next
)
875 if (! bfd_set_section_contents (obfd
, padd
->section
,
876 (PTR
) padd
->contents
,
878 (bfd_size_type
) padd
->size
))
879 RETURN_NONFATAL (bfd_get_filename (obfd
));
883 if (gap_fill_set
|| pad_to_set
)
888 /* Fill in the gaps. */
892 buf
= (bfd_byte
*) xmalloc (max_gap
);
893 memset (buf
, gap_fill
, (size_t) max_gap
);
895 c
= bfd_count_sections (obfd
);
896 for (i
= 0; i
< c
; i
++)
904 off
= bfd_section_size (obfd
, osections
[i
]) - left
;
914 if (! bfd_set_section_contents (obfd
, osections
[i
], buf
,
916 RETURN_NONFATAL (bfd_get_filename (obfd
));
925 /* Allow the BFD backend to copy any private data it understands
926 from the input BFD to the output BFD. This is done last to
927 permit the routine to look at the filtered symbol table, which is
928 important for the ECOFF code at least. */
929 if (!bfd_copy_private_bfd_data (ibfd
, obfd
))
931 non_fatal (_("%s: error copying private BFD data: %s"),
932 bfd_get_filename (obfd
),
933 bfd_errmsg (bfd_get_error ()));
939 /* Read each archive element in turn from IBFD, copy the
940 contents to temp file, and keep the temp file handle. */
943 copy_archive (ibfd
, obfd
, output_target
)
946 const char *output_target
;
950 struct name_list
*next
;
954 bfd
**ptr
= &obfd
->archive_head
;
956 char *dir
= make_tempname (bfd_get_filename (obfd
));
958 /* Make a temp directory to hold the contents. */
959 #if defined (_WIN32) && !defined (__CYGWIN32__)
960 if (mkdir (dir
) != 0)
962 if (mkdir (dir
, 0700) != 0)
965 fatal (_("cannot mkdir %s for archive copying (error: %s)"),
966 dir
, strerror (errno
));
968 obfd
->has_armap
= ibfd
->has_armap
;
972 this_element
= bfd_openr_next_archived_file (ibfd
, NULL
);
973 while (!status
&& this_element
!= (bfd
*) NULL
)
975 /* Create an output file for this member. */
976 char *output_name
= concat (dir
, "/", bfd_get_filename (this_element
),
978 bfd
*output_bfd
= bfd_openw (output_name
, output_target
);
985 stat_status
= bfd_stat_arch_elt (this_element
, &buf
);
986 if (stat_status
!= 0)
987 non_fatal (_("internal stat error on %s"),
988 bfd_get_filename (this_element
));
991 l
= (struct name_list
*) xmalloc (sizeof (struct name_list
));
992 l
->name
= output_name
;
996 if (output_bfd
== (bfd
*) NULL
)
997 RETURN_NONFATAL (output_name
);
999 if (!bfd_set_format (obfd
, bfd_get_format (ibfd
)))
1000 RETURN_NONFATAL (bfd_get_filename (obfd
));
1002 if (bfd_check_format (this_element
, bfd_object
) == true)
1003 copy_object (this_element
, output_bfd
);
1005 if (!bfd_close (output_bfd
))
1007 bfd_nonfatal (bfd_get_filename (output_bfd
));
1008 /* Error in new object file. Don't change archive. */
1012 if (preserve_dates
&& stat_status
== 0)
1013 set_times (output_name
, &buf
);
1015 /* Open the newly output file and attach to our list. */
1016 output_bfd
= bfd_openr (output_name
, output_target
);
1018 l
->obfd
= output_bfd
;
1021 ptr
= &output_bfd
->next
;
1023 last_element
= this_element
;
1025 this_element
= bfd_openr_next_archived_file (ibfd
, last_element
);
1027 bfd_close (last_element
);
1029 *ptr
= (bfd
*) NULL
;
1031 if (!bfd_close (obfd
))
1032 RETURN_NONFATAL (bfd_get_filename (obfd
));
1034 if (!bfd_close (ibfd
))
1035 RETURN_NONFATAL (bfd_get_filename (ibfd
));
1037 /* Delete all the files that we opened. */
1038 for (l
= list
; l
!= NULL
; l
= l
->next
)
1040 bfd_close (l
->obfd
);
1046 /* The top-level control. */
1049 copy_file (input_filename
, output_filename
, input_target
, output_target
)
1050 const char *input_filename
;
1051 const char *output_filename
;
1052 const char *input_target
;
1053 const char *output_target
;
1058 /* To allow us to do "strip *" without dying on the first
1059 non-object file, failures are nonfatal. */
1061 ibfd
= bfd_openr (input_filename
, input_target
);
1063 RETURN_NONFATAL (input_filename
);
1065 if (bfd_check_format (ibfd
, bfd_archive
))
1069 /* bfd_get_target does not return the correct value until
1070 bfd_check_format succeeds. */
1071 if (output_target
== NULL
)
1072 output_target
= bfd_get_target (ibfd
);
1074 obfd
= bfd_openw (output_filename
, output_target
);
1076 RETURN_NONFATAL (output_filename
);
1078 copy_archive (ibfd
, obfd
, output_target
);
1080 else if (bfd_check_format_matches (ibfd
, bfd_object
, &matching
))
1084 /* bfd_get_target does not return the correct value until
1085 bfd_check_format succeeds. */
1086 if (output_target
== NULL
)
1087 output_target
= bfd_get_target (ibfd
);
1089 obfd
= bfd_openw (output_filename
, output_target
);
1091 RETURN_NONFATAL (output_filename
);
1093 copy_object (ibfd
, obfd
);
1095 if (!bfd_close (obfd
))
1096 RETURN_NONFATAL (output_filename
);
1098 if (!bfd_close (ibfd
))
1099 RETURN_NONFATAL (input_filename
);
1103 bfd_nonfatal (input_filename
);
1105 if (bfd_get_error () == bfd_error_file_ambiguously_recognized
)
1107 list_matching_formats (matching
);
1115 /* Create a section in OBFD with the same name and attributes
1116 as ISECTION in IBFD. */
1119 setup_section (ibfd
, isection
, obfdarg
)
1124 bfd
*obfd
= (bfd
*) obfdarg
;
1125 struct section_list
*p
;
1133 if ((bfd_get_section_flags (ibfd
, isection
) & SEC_DEBUGGING
) != 0
1134 && (strip_symbols
== STRIP_DEBUG
1135 || strip_symbols
== STRIP_UNNEEDED
1136 || strip_symbols
== STRIP_ALL
1137 || discard_locals
== LOCALS_ALL
1138 || convert_debugging
))
1141 p
= find_section_list (bfd_section_name (ibfd
, isection
), false);
1145 if (sections_removed
&& p
!= NULL
&& p
->remove
)
1147 if (sections_copied
&& (p
== NULL
|| ! p
->copy
))
1150 osection
= bfd_make_section_anyway (obfd
, bfd_section_name (ibfd
, isection
));
1152 if (osection
== NULL
)
1158 size
= bfd_section_size (ibfd
, isection
);
1160 size
= (size
+ interleave
- 1) / interleave
;
1161 if (! bfd_set_section_size (obfd
, osection
, size
))
1167 vma
= bfd_section_vma (ibfd
, isection
);
1168 if (p
!= NULL
&& p
->change_vma
== CHANGE_MODIFY
)
1170 else if (p
!= NULL
&& p
->change_vma
== CHANGE_SET
)
1173 vma
+= change_section_address
;
1175 if (! bfd_set_section_vma (obfd
, osection
, vma
))
1181 lma
= isection
->lma
;
1182 if ((p
!= NULL
) && p
->change_lma
!= CHANGE_IGNORE
)
1184 if (p
->change_lma
== CHANGE_MODIFY
)
1186 else if (p
->change_lma
== CHANGE_SET
)
1192 lma
+= change_section_address
;
1194 osection
->lma
= lma
;
1196 /* FIXME: This is probably not enough. If we change the LMA we
1197 may have to recompute the header for the file as well. */
1198 if (bfd_set_section_alignment (obfd
,
1200 bfd_section_alignment (ibfd
, isection
))
1207 flags
= bfd_get_section_flags (ibfd
, isection
);
1208 if (p
!= NULL
&& p
->set_flags
)
1209 flags
= p
->flags
| (flags
& SEC_HAS_CONTENTS
);
1210 if (!bfd_set_section_flags (obfd
, osection
, flags
))
1216 /* This used to be mangle_section; we do here to avoid using
1217 bfd_get_section_by_name since some formats allow multiple
1218 sections with the same name. */
1219 isection
->output_section
= osection
;
1220 isection
->output_offset
= 0;
1222 /* Allow the BFD backend to copy any private data it understands
1223 from the input section to the output section. */
1224 if (!bfd_copy_private_section_data (ibfd
, isection
, obfd
, osection
))
1226 err
= "private data";
1234 non_fatal (_("%s: section `%s': error in %s: %s"),
1235 bfd_get_filename (ibfd
),
1236 bfd_section_name (ibfd
, isection
),
1237 err
, bfd_errmsg (bfd_get_error ()));
1241 /* Copy the data of input section ISECTION of IBFD
1242 to an output section with the same name in OBFD.
1243 If stripping then don't copy any relocation info. */
1246 copy_section (ibfd
, isection
, obfdarg
)
1251 bfd
*obfd
= (bfd
*) obfdarg
;
1252 struct section_list
*p
;
1259 /* If we have already failed earlier on, do not keep on generating
1264 if ((bfd_get_section_flags (ibfd
, isection
) & SEC_DEBUGGING
) != 0
1265 && (strip_symbols
== STRIP_DEBUG
1266 || strip_symbols
== STRIP_UNNEEDED
1267 || strip_symbols
== STRIP_ALL
1268 || discard_locals
== LOCALS_ALL
1269 || convert_debugging
))
1274 p
= find_section_list (bfd_section_name (ibfd
, isection
), false);
1276 if (sections_removed
&& p
!= NULL
&& p
->remove
)
1278 if (sections_copied
&& (p
== NULL
|| ! p
->copy
))
1281 osection
= isection
->output_section
;
1282 size
= bfd_get_section_size_before_reloc (isection
);
1284 if (size
== 0 || osection
== 0)
1288 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
1290 RETURN_NONFATAL (bfd_get_filename (ibfd
));
1293 bfd_set_reloc (obfd
, osection
, (arelent
**) NULL
, 0);
1296 relpp
= (arelent
**) xmalloc (relsize
);
1297 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, isympp
);
1299 RETURN_NONFATAL (bfd_get_filename (ibfd
));
1301 if (strip_symbols
== STRIP_ALL
)
1303 /* Remove relocations which are not in
1304 keep_strip_specific_list. */
1305 arelent
**temp_relpp
;
1306 long temp_relcount
= 0;
1309 temp_relpp
= (arelent
**) xmalloc (relsize
);
1310 for (i
= 0; i
< relcount
; i
++)
1311 if (is_specified_symbol
1312 (bfd_asymbol_name (*relpp
[i
]->sym_ptr_ptr
),
1313 keep_specific_list
))
1314 temp_relpp
[temp_relcount
++] = relpp
[i
];
1315 relcount
= temp_relcount
;
1319 bfd_set_reloc (obfd
, osection
,
1320 (relcount
== 0 ? (arelent
**) NULL
: relpp
), relcount
);
1323 isection
->_cooked_size
= isection
->_raw_size
;
1324 isection
->reloc_done
= true;
1326 if (bfd_get_section_flags (ibfd
, isection
) & SEC_HAS_CONTENTS
)
1328 PTR memhunk
= (PTR
) xmalloc ((unsigned) size
);
1330 if (!bfd_get_section_contents (ibfd
, isection
, memhunk
, (file_ptr
) 0,
1332 RETURN_NONFATAL (bfd_get_filename (ibfd
));
1335 filter_bytes (memhunk
, &size
);
1337 if (!bfd_set_section_contents (obfd
, osection
, memhunk
, (file_ptr
) 0,
1339 RETURN_NONFATAL (bfd_get_filename (obfd
));
1343 else if (p
!= NULL
&& p
->set_flags
&& (p
->flags
& SEC_HAS_CONTENTS
) != 0)
1345 PTR memhunk
= (PTR
) xmalloc ((unsigned) size
);
1347 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
1348 flag--they can just remove the section entirely and add it
1349 back again. However, we do permit them to turn on the
1350 SEC_HAS_CONTENTS flag, and take it to mean that the section
1351 contents should be zeroed out. */
1353 memset (memhunk
, 0, size
);
1354 if (! bfd_set_section_contents (obfd
, osection
, memhunk
, (file_ptr
) 0,
1356 RETURN_NONFATAL (bfd_get_filename (obfd
));
1361 /* Get all the sections. This is used when --gap-fill or --pad-to is
1365 get_sections (obfd
, osection
, secppparg
)
1366 bfd
*obfd ATTRIBUTE_UNUSED
;
1370 asection
***secppp
= (asection
***) secppparg
;
1372 **secppp
= osection
;
1376 /* Sort sections by VMA. This is called via qsort, and is used when
1377 --gap-fill or --pad-to is used. We force non loadable or empty
1378 sections to the front, where they are easier to ignore. */
1381 compare_section_lma (arg1
, arg2
)
1385 const asection
**sec1
= (const asection
**) arg1
;
1386 const asection
**sec2
= (const asection
**) arg2
;
1387 flagword flags1
, flags2
;
1389 /* Sort non loadable sections to the front. */
1390 flags1
= (*sec1
)->flags
;
1391 flags2
= (*sec2
)->flags
;
1392 if ((flags1
& SEC_HAS_CONTENTS
) == 0
1393 || (flags1
& SEC_LOAD
) == 0)
1395 if ((flags2
& SEC_HAS_CONTENTS
) != 0
1396 && (flags2
& SEC_LOAD
) != 0)
1401 if ((flags2
& SEC_HAS_CONTENTS
) == 0
1402 || (flags2
& SEC_LOAD
) == 0)
1406 /* Sort sections by LMA. */
1407 if ((*sec1
)->lma
> (*sec2
)->lma
)
1409 else if ((*sec1
)->lma
< (*sec2
)->lma
)
1412 /* Sort sections with the same LMA by size. */
1413 if ((*sec1
)->_raw_size
> (*sec2
)->_raw_size
)
1415 else if ((*sec1
)->_raw_size
< (*sec2
)->_raw_size
)
1421 /* Mark all the symbols which will be used in output relocations with
1422 the BSF_KEEP flag so that those symbols will not be stripped.
1424 Ignore relocations which will not appear in the output file. */
1427 mark_symbols_used_in_relocations (ibfd
, isection
, symbolsarg
)
1432 asymbol
**symbols
= (asymbol
**) symbolsarg
;
1437 /* Ignore an input section with no corresponding output section. */
1438 if (isection
->output_section
== NULL
)
1441 relsize
= bfd_get_reloc_upper_bound (ibfd
, isection
);
1443 bfd_fatal (bfd_get_filename (ibfd
));
1448 relpp
= (arelent
**) xmalloc (relsize
);
1449 relcount
= bfd_canonicalize_reloc (ibfd
, isection
, relpp
, symbols
);
1451 bfd_fatal (bfd_get_filename (ibfd
));
1453 /* Examine each symbol used in a relocation. If it's not one of the
1454 special bfd section symbols, then mark it with BSF_KEEP. */
1455 for (i
= 0; i
< relcount
; i
++)
1457 if (*relpp
[i
]->sym_ptr_ptr
!= bfd_com_section_ptr
->symbol
1458 && *relpp
[i
]->sym_ptr_ptr
!= bfd_abs_section_ptr
->symbol
1459 && *relpp
[i
]->sym_ptr_ptr
!= bfd_und_section_ptr
->symbol
)
1460 (*relpp
[i
]->sym_ptr_ptr
)->flags
|= BSF_KEEP
;
1467 /* Write out debugging information. */
1470 write_debugging_info (obfd
, dhandle
, symcountp
, symppp
)
1473 long *symcountp ATTRIBUTE_UNUSED
;
1474 asymbol
***symppp ATTRIBUTE_UNUSED
;
1476 if (bfd_get_flavour (obfd
) == bfd_target_ieee_flavour
)
1477 return write_ieee_debugging_info (obfd
, dhandle
);
1479 if (bfd_get_flavour (obfd
) == bfd_target_coff_flavour
1480 || bfd_get_flavour (obfd
) == bfd_target_elf_flavour
)
1482 bfd_byte
*syms
, *strings
;
1483 bfd_size_type symsize
, stringsize
;
1484 asection
*stabsec
, *stabstrsec
;
1486 if (! write_stabs_in_sections_debugging_info (obfd
, dhandle
, &syms
,
1491 stabsec
= bfd_make_section (obfd
, ".stab");
1492 stabstrsec
= bfd_make_section (obfd
, ".stabstr");
1494 || stabstrsec
== NULL
1495 || ! bfd_set_section_size (obfd
, stabsec
, symsize
)
1496 || ! bfd_set_section_size (obfd
, stabstrsec
, stringsize
)
1497 || ! bfd_set_section_alignment (obfd
, stabsec
, 2)
1498 || ! bfd_set_section_alignment (obfd
, stabstrsec
, 0)
1499 || ! bfd_set_section_flags (obfd
, stabsec
,
1503 || ! bfd_set_section_flags (obfd
, stabstrsec
,
1508 non_fatal (_("%s: can't create debugging section: %s"),
1509 bfd_get_filename (obfd
),
1510 bfd_errmsg (bfd_get_error ()));
1514 /* We can get away with setting the section contents now because
1515 the next thing the caller is going to do is copy over the
1516 real sections. We may someday have to split the contents
1517 setting out of this function. */
1518 if (! bfd_set_section_contents (obfd
, stabsec
, syms
, (file_ptr
) 0,
1520 || ! bfd_set_section_contents (obfd
, stabstrsec
, strings
,
1521 (file_ptr
) 0, stringsize
))
1523 non_fatal (_("%s: can't set debugging section contents: %s"),
1524 bfd_get_filename (obfd
),
1525 bfd_errmsg (bfd_get_error ()));
1532 non_fatal (_("%s: don't know how to write debugging information for %s"),
1533 bfd_get_filename (obfd
), bfd_get_target (obfd
));
1538 strip_main (argc
, argv
)
1542 char *input_target
= NULL
, *output_target
= NULL
;
1543 boolean show_version
= false;
1545 struct section_list
*p
;
1546 char *output_file
= NULL
;
1548 while ((c
= getopt_long (argc
, argv
, "I:O:F:K:N:R:o:sSpgxXVv",
1549 strip_options
, (int *) 0)) != EOF
)
1554 input_target
= optarg
;
1557 output_target
= optarg
;
1560 input_target
= output_target
= optarg
;
1563 p
= find_section_list (optarg
, true);
1565 sections_removed
= true;
1568 strip_symbols
= STRIP_ALL
;
1572 strip_symbols
= STRIP_DEBUG
;
1574 case OPTION_STRIP_UNNEEDED
:
1575 strip_symbols
= STRIP_UNNEEDED
;
1578 add_specific_symbol (optarg
, &keep_specific_list
);
1581 add_specific_symbol (optarg
, &strip_specific_list
);
1584 output_file
= optarg
;
1587 preserve_dates
= true;
1590 discard_locals
= LOCALS_ALL
;
1593 discard_locals
= LOCALS_START_L
;
1599 show_version
= true;
1602 break; /* we've been given a long option */
1604 strip_usage (stdout
, 0);
1606 strip_usage (stderr
, 1);
1611 print_version ("strip");
1613 /* Default is to strip all symbols. */
1614 if (strip_symbols
== STRIP_UNDEF
1615 && discard_locals
== LOCALS_UNDEF
1616 && strip_specific_list
== NULL
)
1617 strip_symbols
= STRIP_ALL
;
1619 if (output_target
== (char *) NULL
)
1620 output_target
= input_target
;
1624 || (output_file
!= NULL
&& (i
+ 1) < argc
))
1625 strip_usage (stderr
, 1);
1627 for (; i
< argc
; i
++)
1629 int hold_status
= status
;
1630 struct stat statbuf
;
1635 if (stat (argv
[i
], &statbuf
) < 0)
1637 non_fatal (_("%s: cannot stat: %s"), argv
[i
], strerror (errno
));
1642 if (output_file
!= NULL
)
1643 tmpname
= output_file
;
1645 tmpname
= make_tempname (argv
[i
]);
1648 copy_file (argv
[i
], tmpname
, input_target
, output_target
);
1652 set_times (tmpname
, &statbuf
);
1653 if (output_file
== NULL
)
1654 smart_rename (tmpname
, argv
[i
], preserve_dates
);
1655 status
= hold_status
;
1659 if (output_file
== NULL
)
1667 copy_main (argc
, argv
)
1671 char *input_filename
= NULL
, *output_filename
= NULL
;
1672 char *input_target
= NULL
, *output_target
= NULL
;
1673 boolean show_version
= false;
1674 boolean change_warn
= true;
1676 struct section_list
*p
;
1677 struct stat statbuf
;
1679 while ((c
= getopt_long (argc
, argv
, "b:i:I:j:K:N:s:O:d:F:L:R:SpgxXVvW:",
1680 copy_options
, (int *) 0)) != EOF
)
1685 copy_byte
= atoi (optarg
);
1687 fatal (_("byte number must be non-negative"));
1690 interleave
= atoi (optarg
);
1692 fatal (_("interleave must be positive"));
1695 case 's': /* "source" - 'I' is preferred */
1696 input_target
= optarg
;
1699 case 'd': /* "destination" - 'O' is preferred */
1700 output_target
= optarg
;
1703 input_target
= output_target
= optarg
;
1706 p
= find_section_list (optarg
, true);
1708 fatal (_("%s both copied and removed"), optarg
);
1710 sections_copied
= true;
1713 p
= find_section_list (optarg
, true);
1715 fatal (_("%s both copied and removed"), optarg
);
1717 sections_removed
= true;
1720 strip_symbols
= STRIP_ALL
;
1723 strip_symbols
= STRIP_DEBUG
;
1725 case OPTION_STRIP_UNNEEDED
:
1726 strip_symbols
= STRIP_UNNEEDED
;
1729 add_specific_symbol (optarg
, &keep_specific_list
);
1732 add_specific_symbol (optarg
, &strip_specific_list
);
1735 add_specific_symbol (optarg
, &localize_specific_list
);
1738 add_specific_symbol (optarg
, &weaken_specific_list
);
1741 preserve_dates
= true;
1744 discard_locals
= LOCALS_ALL
;
1747 discard_locals
= LOCALS_START_L
;
1753 show_version
= true;
1758 case OPTION_ADD_SECTION
:
1762 struct section_add
*pa
;
1767 s
= strchr (optarg
, '=');
1770 fatal (_("bad format for --add-section NAME=FILENAME"));
1772 if (stat (s
+ 1, & st
) < 0)
1773 fatal (_("cannot stat: %s: %s"), s
+ 1, strerror (errno
));
1775 pa
= (struct section_add
*) xmalloc (sizeof (struct section_add
));
1778 name
= (char *) xmalloc (len
+ 1);
1779 strncpy (name
, optarg
, len
);
1783 pa
->filename
= s
+ 1;
1785 pa
->size
= st
.st_size
;
1787 pa
->contents
= (bfd_byte
*) xmalloc (pa
->size
);
1788 f
= fopen (pa
->filename
, FOPEN_RB
);
1791 fatal (_("cannot open: %s: %s"), pa
->filename
, strerror (errno
));
1793 if (fread (pa
->contents
, 1, pa
->size
, f
) == 0
1795 fatal (_("%s: fread failed"), pa
->filename
);
1799 pa
->next
= add_sections
;
1803 case OPTION_CHANGE_START
:
1804 change_start
= parse_vma (optarg
, "--change-start");
1806 case OPTION_CHANGE_SECTION_ADDRESS
:
1807 case OPTION_CHANGE_SECTION_LMA
:
1808 case OPTION_CHANGE_SECTION_VMA
:
1813 char *option
= NULL
;
1815 enum change_action what
= CHANGE_IGNORE
;
1819 case OPTION_CHANGE_SECTION_ADDRESS
:
1820 option
= "--change-section-address";
1822 case OPTION_CHANGE_SECTION_LMA
:
1823 option
= "--change-section-lma";
1825 case OPTION_CHANGE_SECTION_VMA
:
1826 option
= "--change-section-vma";
1830 s
= strchr (optarg
, '=');
1833 s
= strchr (optarg
, '+');
1836 s
= strchr (optarg
, '-');
1838 fatal (_("bad format for %s"), option
);
1843 name
= (char *) xmalloc (len
+ 1);
1844 strncpy (name
, optarg
, len
);
1847 p
= find_section_list (name
, true);
1849 val
= parse_vma (s
+ 1, option
);
1853 case '=': what
= CHANGE_SET
; break;
1854 case '-': val
= - val
; /* Drop through. */
1855 case '+': what
= CHANGE_MODIFY
; break;
1860 case OPTION_CHANGE_SECTION_ADDRESS
:
1861 p
->change_vma
= what
;
1865 case OPTION_CHANGE_SECTION_LMA
:
1866 p
->change_lma
= what
;
1870 case OPTION_CHANGE_SECTION_VMA
:
1871 p
->change_vma
= what
;
1877 case OPTION_CHANGE_ADDRESSES
:
1878 change_section_address
= parse_vma (optarg
, "--change-addresses");
1879 change_start
= change_section_address
;
1881 case OPTION_CHANGE_WARNINGS
:
1884 case OPTION_CHANGE_LEADING_CHAR
:
1885 change_leading_char
= true;
1887 case OPTION_DEBUGGING
:
1888 convert_debugging
= true;
1890 case OPTION_GAP_FILL
:
1892 bfd_vma gap_fill_vma
;
1894 gap_fill_vma
= parse_vma (optarg
, "--gap-fill");
1895 gap_fill
= (bfd_byte
) gap_fill_vma
;
1896 if ((bfd_vma
) gap_fill
!= gap_fill_vma
)
1900 sprintf_vma (buff
, gap_fill_vma
);
1902 non_fatal (_("Warning: truncating gap-fill from 0x%s to 0x%x"),
1905 gap_fill_set
= true;
1908 case OPTION_NO_CHANGE_WARNINGS
:
1909 change_warn
= false;
1912 pad_to
= parse_vma (optarg
, "--pad-to");
1915 case OPTION_REMOVE_LEADING_CHAR
:
1916 remove_leading_char
= true;
1918 case OPTION_SET_SECTION_FLAGS
:
1924 s
= strchr (optarg
, '=');
1926 fatal (_("bad format for --set-section-flags"));
1929 name
= (char *) xmalloc (len
+ 1);
1930 strncpy (name
, optarg
, len
);
1933 p
= find_section_list (name
, true);
1935 p
->set_flags
= true;
1936 p
->flags
= parse_flags (s
+ 1);
1939 case OPTION_SET_START
:
1940 set_start
= parse_vma (optarg
, "--set-start");
1941 set_start_set
= true;
1944 break; /* we've been given a long option */
1946 copy_usage (stdout
, 0);
1948 copy_usage (stderr
, 1);
1953 print_version ("objcopy");
1955 if (copy_byte
>= interleave
)
1956 fatal (_("byte number must be less than interleave"));
1958 if (optind
== argc
|| optind
+ 2 < argc
)
1959 copy_usage (stderr
, 1);
1961 input_filename
= argv
[optind
];
1962 if (optind
+ 1 < argc
)
1963 output_filename
= argv
[optind
+ 1];
1965 /* Default is to strip no symbols. */
1966 if (strip_symbols
== STRIP_UNDEF
&& discard_locals
== LOCALS_UNDEF
)
1967 strip_symbols
= STRIP_NONE
;
1969 if (output_target
== (char *) NULL
)
1970 output_target
= input_target
;
1974 if (stat (input_filename
, &statbuf
) < 0)
1975 fatal (_("Cannot stat: %s: %s"), input_filename
, strerror (errno
));
1978 /* If there is no destination file then create a temp and rename
1979 the result into the input. */
1981 if (output_filename
== (char *) NULL
)
1983 char *tmpname
= make_tempname (input_filename
);
1985 copy_file (input_filename
, tmpname
, input_target
, output_target
);
1989 set_times (tmpname
, &statbuf
);
1990 smart_rename (tmpname
, input_filename
, preserve_dates
);
1997 copy_file (input_filename
, output_filename
, input_target
, output_target
);
1998 if (status
== 0 && preserve_dates
)
1999 set_times (output_filename
, &statbuf
);
2004 for (p
= change_sections
; p
!= NULL
; p
= p
->next
)
2008 if (p
->change_vma
!= CHANGE_IGNORE
)
2012 sprintf_vma (buff
, p
->vma_val
);
2014 /* xgettext:c-format */
2015 non_fatal (_("Warning: --change-section-vma %s%c0x%s never used"),
2017 p
->change_vma
== CHANGE_SET
? '=' : '+',
2021 if (p
->change_lma
!= CHANGE_IGNORE
)
2025 sprintf_vma (buff
, p
->lma_val
);
2027 /* xgettext:c-format */
2028 non_fatal (_("Warning: --change-section-lma %s%c0x%s never used"),
2030 p
->change_lma
== CHANGE_SET
? '=' : '+',
2045 #if defined (HAVE_SETLOCALE) && defined (HAVE_LC_MESSAGES)
2046 setlocale (LC_MESSAGES
, "");
2048 bindtextdomain (PACKAGE
, LOCALEDIR
);
2049 textdomain (PACKAGE
);
2051 program_name
= argv
[0];
2052 xmalloc_set_program_name (program_name
);
2054 START_PROGRESS (program_name
, 0);
2056 strip_symbols
= STRIP_UNDEF
;
2057 discard_locals
= LOCALS_UNDEF
;
2060 set_default_bfd_target ();
2064 int i
= strlen (program_name
);
2065 is_strip
= (i
>= 5 && strcmp (program_name
+ i
- 5, "strip") == 0);
2069 strip_main (argc
, argv
);
2071 copy_main (argc
, argv
);
2073 END_PROGRESS (program_name
);