This commit was generated by cvs2svn to track changes on a CVS vendor
[deliverable/binutils-gdb.git] / binutils / objcopy.c
1 /* objcopy.c -- copy object file from input to output, optionally massaging it.
2 Copyright (C) 1991, 92, 93, 94, 95, 96, 97, 1998
3 Free Software Foundation, Inc.
4
5 This file is part of GNU Binutils.
6
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.
11
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.
16
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
20 02111-1307, USA. */
21 \f
22 #include "bfd.h"
23 #include "progress.h"
24 #include "bucomm.h"
25 #include "getopt.h"
26 #include "libiberty.h"
27 #include "budbg.h"
28 #include <sys/stat.h>
29
30 #ifdef HAVE_GOOD_UTIME_H
31 #include <utime.h>
32 #else /* ! HAVE_GOOD_UTIME_H */
33 #ifdef HAVE_UTIMES
34 #include <sys/time.h>
35 #endif /* HAVE_UTIMES */
36 #endif /* ! HAVE_GOOD_UTIME_H */
37
38 /* A list of symbols to explicitly strip out, or to keep. A linked
39 list is good enough for a small number from the command line, but
40 this will slow things down a lot if many symbols are being
41 deleted. */
42
43 struct symlist
44 {
45 const char *name;
46 struct symlist *next;
47 };
48
49 static void copy_usage PARAMS ((FILE *, int));
50 static void strip_usage PARAMS ((FILE *, int));
51 static flagword parse_flags PARAMS ((const char *));
52 static struct section_list *find_section_list PARAMS ((const char *, boolean));
53 static void setup_section PARAMS ((bfd *, asection *, PTR));
54 static void copy_section PARAMS ((bfd *, asection *, PTR));
55 static void get_sections PARAMS ((bfd *, asection *, PTR));
56 static int compare_section_vma PARAMS ((const PTR, const PTR));
57 static void add_specific_symbol PARAMS ((const char *, struct symlist **));
58 static boolean is_specified_symbol PARAMS ((const char *, struct symlist *));
59 static boolean is_strip_section PARAMS ((bfd *, asection *));
60 static unsigned int filter_symbols
61 PARAMS ((bfd *, bfd *, asymbol **, asymbol **, long));
62 static void mark_symbols_used_in_relocations PARAMS ((bfd *, asection *, PTR));
63 static void filter_bytes PARAMS ((char *, bfd_size_type *));
64 static boolean write_debugging_info PARAMS ((bfd *, PTR, long *, asymbol ***));
65 static void copy_object PARAMS ((bfd *, bfd *));
66 static void copy_archive PARAMS ((bfd *, bfd *, const char *));
67 static void copy_file
68 PARAMS ((const char *, const char *, const char *, const char *));
69 static int simple_copy PARAMS ((const char *, const char *));
70 static int smart_rename PARAMS ((const char *, const char *));
71 static void set_times PARAMS ((const char *, const struct stat *));
72 static int strip_main PARAMS ((int, char **));
73 static int copy_main PARAMS ((int, char **));
74
75 #define nonfatal(s) {bfd_nonfatal(s); status = 1; return;}
76
77 static asymbol **isympp = NULL; /* Input symbols */
78 static asymbol **osympp = NULL; /* Output symbols that survive stripping */
79
80 /* If `copy_byte' >= 0, copy only that byte of every `interleave' bytes. */
81 static int copy_byte = -1;
82 static int interleave = 4;
83
84 static boolean verbose; /* Print file and target names. */
85 static int status = 0; /* Exit status. */
86
87 enum strip_action
88 {
89 strip_undef,
90 strip_none, /* don't strip */
91 strip_debug, /* strip all debugger symbols */
92 strip_unneeded, /* strip unnecessary symbols */
93 strip_all /* strip all symbols */
94 };
95
96 /* Which symbols to remove. */
97 static enum strip_action strip_symbols;
98
99 enum locals_action
100 {
101 locals_undef,
102 locals_start_L, /* discard locals starting with L */
103 locals_all /* discard all locals */
104 };
105
106 /* Which local symbols to remove. Overrides strip_all. */
107 static enum locals_action discard_locals;
108
109 /* Structure used to hold lists of sections and actions to take. */
110
111 struct section_list
112 {
113 /* Next section to adjust. */
114 struct section_list *next;
115 /* Section name. */
116 const char *name;
117 /* Whether this entry was used. */
118 boolean used;
119 /* Whether to remove this section. */
120 boolean remove;
121 /* Whether to adjust or set VMA. */
122 enum { ignore_vma, adjust_vma, set_vma } adjust;
123 /* Amount to adjust by or set to. */
124 bfd_vma val;
125 /* Whether to set the section flags. */
126 boolean set_flags;
127 /* What to set the section flags to. */
128 flagword flags;
129 };
130
131 static struct section_list *adjust_sections;
132 static boolean sections_removed;
133
134 /* Adjustments to the start address. */
135 static bfd_vma adjust_start = 0;
136 static boolean set_start_set = false;
137 static bfd_vma set_start;
138
139 /* Adjustments to section VMA's. */
140 static bfd_vma adjust_section_vma = 0;
141
142 /* Filling gaps between sections. */
143 static boolean gap_fill_set = false;
144 static bfd_byte gap_fill = 0;
145
146 /* Pad to a given address. */
147 static boolean pad_to_set = false;
148 static bfd_vma pad_to;
149
150 /* List of sections to add. */
151
152 struct section_add
153 {
154 /* Next section to add. */
155 struct section_add *next;
156 /* Name of section to add. */
157 const char *name;
158 /* Name of file holding section contents. */
159 const char *filename;
160 /* Size of file. */
161 size_t size;
162 /* Contents of file. */
163 bfd_byte *contents;
164 /* BFD section, after it has been added. */
165 asection *section;
166 };
167
168 static struct section_add *add_sections;
169
170 /* Whether to convert debugging information. */
171
172 static boolean convert_debugging = false;
173
174 /* Whether to change the leading character in symbol names. */
175
176 static boolean change_leading_char = false;
177
178 /* Whether to remove the leading character from global symbol names. */
179
180 static boolean remove_leading_char = false;
181
182 /* List of symbols to strip, keep, localize, and weaken. */
183
184 static struct symlist *strip_specific_list = NULL;
185 static struct symlist *keep_specific_list = NULL;
186 static struct symlist *localize_specific_list = NULL;
187 static struct symlist *weaken_specific_list = NULL;
188
189 /* If this is true, we weaken global symbols (set BSF_WEAK). */
190
191 static boolean weaken = false;
192
193 /* 150 isn't special; it's just an arbitrary non-ASCII char value. */
194
195 #define OPTION_ADD_SECTION 150
196 #define OPTION_ADJUST_START (OPTION_ADD_SECTION + 1)
197 #define OPTION_ADJUST_VMA (OPTION_ADJUST_START + 1)
198 #define OPTION_ADJUST_SECTION_VMA (OPTION_ADJUST_VMA + 1)
199 #define OPTION_ADJUST_WARNINGS (OPTION_ADJUST_SECTION_VMA + 1)
200 #define OPTION_CHANGE_LEADING_CHAR (OPTION_ADJUST_WARNINGS + 1)
201 #define OPTION_DEBUGGING (OPTION_CHANGE_LEADING_CHAR + 1)
202 #define OPTION_GAP_FILL (OPTION_DEBUGGING + 1)
203 #define OPTION_NO_ADJUST_WARNINGS (OPTION_GAP_FILL + 1)
204 #define OPTION_PAD_TO (OPTION_NO_ADJUST_WARNINGS + 1)
205 #define OPTION_REMOVE_LEADING_CHAR (OPTION_PAD_TO + 1)
206 #define OPTION_SET_SECTION_FLAGS (OPTION_REMOVE_LEADING_CHAR + 1)
207 #define OPTION_SET_START (OPTION_SET_SECTION_FLAGS + 1)
208 #define OPTION_STRIP_UNNEEDED (OPTION_SET_START + 1)
209 #define OPTION_WEAKEN (OPTION_STRIP_UNNEEDED + 1)
210
211 /* Options to handle if running as "strip". */
212
213 static struct option strip_options[] =
214 {
215 {"discard-all", no_argument, 0, 'x'},
216 {"discard-locals", no_argument, 0, 'X'},
217 {"format", required_argument, 0, 'F'}, /* Obsolete */
218 {"help", no_argument, 0, 'h'},
219 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
220 {"input-target", required_argument, 0, 'I'},
221 {"keep-symbol", required_argument, 0, 'K'},
222 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
223 {"output-target", required_argument, 0, 'O'},
224 {"preserve-dates", no_argument, 0, 'p'},
225 {"remove-section", required_argument, 0, 'R'},
226 {"strip-all", no_argument, 0, 's'},
227 {"strip-debug", no_argument, 0, 'S'},
228 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
229 {"strip-symbol", required_argument, 0, 'N'},
230 {"target", required_argument, 0, 'F'},
231 {"verbose", no_argument, 0, 'v'},
232 {"version", no_argument, 0, 'V'},
233 {0, no_argument, 0, 0}
234 };
235
236 /* Options to handle if running as "objcopy". */
237
238 static struct option copy_options[] =
239 {
240 {"add-section", required_argument, 0, OPTION_ADD_SECTION},
241 {"adjust-start", required_argument, 0, OPTION_ADJUST_START},
242 {"adjust-vma", required_argument, 0, OPTION_ADJUST_VMA},
243 {"adjust-section-vma", required_argument, 0, OPTION_ADJUST_SECTION_VMA},
244 {"adjust-warnings", no_argument, 0, OPTION_ADJUST_WARNINGS},
245 {"byte", required_argument, 0, 'b'},
246 {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR},
247 {"debugging", no_argument, 0, OPTION_DEBUGGING},
248 {"discard-all", no_argument, 0, 'x'},
249 {"discard-locals", no_argument, 0, 'X'},
250 {"format", required_argument, 0, 'F'}, /* Obsolete */
251 {"gap-fill", required_argument, 0, OPTION_GAP_FILL},
252 {"help", no_argument, 0, 'h'},
253 {"input-format", required_argument, 0, 'I'}, /* Obsolete */
254 {"input-target", required_argument, 0, 'I'},
255 {"interleave", required_argument, 0, 'i'},
256 {"keep-symbol", required_argument, 0, 'K'},
257 {"no-adjust-warnings", no_argument, 0, OPTION_NO_ADJUST_WARNINGS},
258 {"output-format", required_argument, 0, 'O'}, /* Obsolete */
259 {"output-target", required_argument, 0, 'O'},
260 {"pad-to", required_argument, 0, OPTION_PAD_TO},
261 {"preserve-dates", no_argument, 0, 'p'},
262 {"localize-symbol", required_argument, 0, 'L'},
263 {"remove-leading-char", no_argument, 0, OPTION_REMOVE_LEADING_CHAR},
264 {"remove-section", required_argument, 0, 'R'},
265 {"set-section-flags", required_argument, 0, OPTION_SET_SECTION_FLAGS},
266 {"set-start", required_argument, 0, OPTION_SET_START},
267 {"strip-all", no_argument, 0, 'S'},
268 {"strip-debug", no_argument, 0, 'g'},
269 {"strip-unneeded", no_argument, 0, OPTION_STRIP_UNNEEDED},
270 {"strip-symbol", required_argument, 0, 'N'},
271 {"target", required_argument, 0, 'F'},
272 {"verbose", no_argument, 0, 'v'},
273 {"version", no_argument, 0, 'V'},
274 {"weaken", no_argument, 0, OPTION_WEAKEN},
275 {"weaken-symbol", required_argument, 0, 'W'},
276 {0, no_argument, 0, 0}
277 };
278
279 /* IMPORTS */
280 extern char *program_name;
281
282 /* This flag distinguishes between strip and objcopy:
283 1 means this is 'strip'; 0 means this is 'objcopy'.
284 -1 means if we should use argv[0] to decide. */
285 extern int is_strip;
286
287
288 static void
289 copy_usage (stream, exit_status)
290 FILE *stream;
291 int exit_status;
292 {
293 fprintf (stream, "\
294 Usage: %s [-vVSpgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-b byte]\n\
295 [-R section] [-i interleave] [--interleave=interleave] [--byte=byte]\n\
296 [--input-target=bfdname] [--output-target=bfdname] [--target=bfdname]\n\
297 [--strip-all] [--strip-debug] [--strip-unneeded] [--discard-all]\n\
298 [--discard-locals] [--debugging] [--remove-section=section]\n",
299 program_name);
300 fprintf (stream, "\
301 [--gap-fill=val] [--pad-to=address] [--preserve-dates]\n\
302 [--set-start=val] [--adjust-start=incr]\n\
303 [--adjust-vma=incr] [--adjust-section-vma=section{=,+,-}val]\n\
304 [--adjust-warnings] [--no-adjust-warnings]\n\
305 [--set-section-flags=section=flags] [--add-section=sectionname=filename]\n\
306 [--keep-symbol symbol] [-K symbol] [--strip-symbol symbol] [-N symbol]\n\
307 [--localize-symbol symbol] [-L symbol] [--weaken-symbol symbol]\n\
308 [-W symbol] [--change-leading-char] [--remove-leading-char] [--weaken]\n\
309 [--verbose] [--version] [--help] in-file [out-file]\n");
310 list_supported_targets (program_name, stream);
311 if (exit_status == 0)
312 fprintf (stream, "Report bugs to bug-gnu-utils@gnu.org\n");
313 exit (exit_status);
314 }
315
316 static void
317 strip_usage (stream, exit_status)
318 FILE *stream;
319 int exit_status;
320 {
321 fprintf (stream, "\
322 Usage: %s [-vVsSpgxX] [-I bfdname] [-O bfdname] [-F bfdname] [-R section]\n\
323 [--input-target=bfdname] [--output-target=bfdname] [--target=bfdname]\n\
324 [--strip-all] [--strip-debug] [--strip-unneeded] [--discard-all]\n\
325 [--discard-locals] [--keep-symbol symbol] [-K symbol]\n\
326 [--strip-symbol symbol] [-N symbol] [--remove-section=section]\n\
327 [-o file] [--preserve-dates] [--verbose] [--version] [--help] file...\n",
328 program_name);
329 list_supported_targets (program_name, stream);
330 if (exit_status == 0)
331 fprintf (stream, "Report bugs to bug-gnu-utils@gnu.org\n");
332 exit (exit_status);
333 }
334
335 /* Parse section flags into a flagword, with a fatal error if the
336 string can't be parsed. */
337
338 static flagword
339 parse_flags (s)
340 const char *s;
341 {
342 flagword ret;
343 const char *snext;
344 int len;
345
346 ret = SEC_NO_FLAGS;
347
348 do
349 {
350 snext = strchr (s, ',');
351 if (snext == NULL)
352 len = strlen (s);
353 else
354 {
355 len = snext - s;
356 ++snext;
357 }
358
359 if (0) ;
360 #define PARSE_FLAG(fname,fval) \
361 else if (strncasecmp (fname, s, len) == 0) ret |= fval
362 PARSE_FLAG ("alloc", SEC_ALLOC);
363 PARSE_FLAG ("load", SEC_LOAD);
364 PARSE_FLAG ("readonly", SEC_READONLY);
365 PARSE_FLAG ("code", SEC_CODE);
366 PARSE_FLAG ("data", SEC_DATA);
367 PARSE_FLAG ("rom", SEC_ROM);
368 PARSE_FLAG ("contents", SEC_HAS_CONTENTS);
369 #undef PARSE_FLAG
370 else
371 {
372 char *copy;
373
374 copy = xmalloc (len + 1);
375 strncpy (copy, s, len);
376 copy[len] = '\0';
377 fprintf (stderr, "%s: unrecognized section flag `%s'\n",
378 program_name, copy);
379 fprintf (stderr,
380 "%s: supported flags: alloc, load, readonly, code, data, rom, contents\n",
381 program_name);
382 exit (1);
383 }
384
385 s = snext;
386 }
387 while (s != NULL);
388
389 return ret;
390 }
391
392 /* Find and optionally add an entry in the adjust_sections list. */
393
394 static struct section_list *
395 find_section_list (name, add)
396 const char *name;
397 boolean add;
398 {
399 register struct section_list *p;
400
401 for (p = adjust_sections; p != NULL; p = p->next)
402 if (strcmp (p->name, name) == 0)
403 return p;
404
405 if (! add)
406 return NULL;
407
408 p = (struct section_list *) xmalloc (sizeof (struct section_list));
409 p->name = name;
410 p->used = false;
411 p->remove = false;
412 p->adjust = ignore_vma;
413 p->val = 0;
414 p->set_flags = false;
415 p->flags = 0;
416
417 p->next = adjust_sections;
418 adjust_sections = p;
419
420 return p;
421 }
422
423 /* Add a symbol to strip_specific_list. */
424
425 static void
426 add_specific_symbol (name, list)
427 const char *name;
428 struct symlist **list;
429 {
430 struct symlist *tmp_list;
431
432 tmp_list = (struct symlist *) xmalloc (sizeof (struct symlist));
433 tmp_list->name = name;
434 tmp_list->next = *list;
435 *list = tmp_list;
436 }
437
438 /* See whether a symbol should be stripped or kept based on
439 strip_specific_list and keep_symbols. */
440
441 static boolean
442 is_specified_symbol (name, list)
443 const char *name;
444 struct symlist *list;
445 {
446 struct symlist *tmp_list;
447
448 for (tmp_list = list; tmp_list; tmp_list = tmp_list->next)
449 {
450 if (strcmp (name, tmp_list->name) == 0)
451 return true;
452 }
453 return false;
454 }
455
456 /* See if a section is being removed. */
457
458 static boolean
459 is_strip_section (abfd, sec)
460 bfd *abfd;
461 asection *sec;
462 {
463 struct section_list *p;
464
465 if ((bfd_get_section_flags (abfd, sec) & SEC_DEBUGGING) != 0
466 && (strip_symbols == strip_debug
467 || strip_symbols == strip_unneeded
468 || strip_symbols == strip_all
469 || discard_locals == locals_all
470 || convert_debugging))
471 return true;
472
473 if (! sections_removed)
474 return false;
475 p = find_section_list (bfd_get_section_name (abfd, sec), false);
476 return p != NULL && p->remove ? true : false;
477 }
478
479 /* Choose which symbol entries to copy; put the result in OSYMS.
480 We don't copy in place, because that confuses the relocs.
481 Return the number of symbols to print. */
482
483 static unsigned int
484 filter_symbols (abfd, obfd, osyms, isyms, symcount)
485 bfd *abfd;
486 bfd *obfd;
487 asymbol **osyms, **isyms;
488 long symcount;
489 {
490 register asymbol **from = isyms, **to = osyms;
491 long src_count = 0, dst_count = 0;
492
493 for (; src_count < symcount; src_count++)
494 {
495 asymbol *sym = from[src_count];
496 flagword flags = sym->flags;
497 const char *name = bfd_asymbol_name (sym);
498 int keep;
499
500 if (change_leading_char
501 && (bfd_get_symbol_leading_char (abfd)
502 != bfd_get_symbol_leading_char (obfd))
503 && (bfd_get_symbol_leading_char (abfd) == '\0'
504 || (name[0] == bfd_get_symbol_leading_char (abfd))))
505 {
506 if (bfd_get_symbol_leading_char (obfd) == '\0')
507 name = bfd_asymbol_name (sym) = name + 1;
508 else
509 {
510 char *n;
511
512 n = xmalloc (strlen (name) + 2);
513 n[0] = bfd_get_symbol_leading_char (obfd);
514 if (bfd_get_symbol_leading_char (abfd) == '\0')
515 strcpy (n + 1, name);
516 else
517 strcpy (n + 1, name + 1);
518 name = bfd_asymbol_name (sym) = n;
519 }
520 }
521
522 if (remove_leading_char
523 && ((flags & BSF_GLOBAL) != 0
524 || (flags & BSF_WEAK) != 0
525 || bfd_is_und_section (bfd_get_section (sym))
526 || bfd_is_com_section (bfd_get_section (sym)))
527 && name[0] == bfd_get_symbol_leading_char (abfd))
528 name = bfd_asymbol_name (sym) = name + 1;
529
530 if ((flags & BSF_KEEP) != 0) /* Used in relocation. */
531 keep = 1;
532 else if ((flags & BSF_GLOBAL) != 0 /* Global symbol. */
533 || (flags & BSF_WEAK) != 0
534 || bfd_is_und_section (bfd_get_section (sym))
535 || bfd_is_com_section (bfd_get_section (sym)))
536 keep = strip_symbols != strip_unneeded;
537 else if ((flags & BSF_DEBUGGING) != 0) /* Debugging symbol. */
538 keep = (strip_symbols != strip_debug
539 && strip_symbols != strip_unneeded
540 && ! convert_debugging);
541 else /* Local symbol. */
542 keep = (strip_symbols != strip_unneeded
543 && (discard_locals != locals_all
544 && (discard_locals != locals_start_L
545 || ! bfd_is_local_label (abfd, sym))));
546
547 if (keep && is_specified_symbol (name, strip_specific_list))
548 keep = 0;
549 if (!keep && is_specified_symbol (name, keep_specific_list))
550 keep = 1;
551 if (keep && is_strip_section (abfd, bfd_get_section (sym)))
552 keep = 0;
553
554 if (keep && (flags & BSF_GLOBAL) != 0
555 && (weaken || is_specified_symbol (name, weaken_specific_list)))
556 {
557 sym->flags &=~ BSF_GLOBAL;
558 sym->flags |= BSF_WEAK;
559 }
560 if (keep && (flags & (BSF_GLOBAL | BSF_WEAK))
561 && is_specified_symbol (name, localize_specific_list))
562 {
563 sym->flags &= ~(BSF_GLOBAL | BSF_WEAK);
564 sym->flags |= BSF_LOCAL;
565 }
566
567 if (keep)
568 to[dst_count++] = sym;
569 }
570
571 to[dst_count] = NULL;
572
573 return dst_count;
574 }
575
576 /* Keep only every `copy_byte'th byte in MEMHUNK, which is *SIZE bytes long.
577 Adjust *SIZE. */
578
579 static void
580 filter_bytes (memhunk, size)
581 char *memhunk;
582 bfd_size_type *size;
583 {
584 char *from = memhunk + copy_byte, *to = memhunk, *end = memhunk + *size;
585
586 for (; from < end; from += interleave)
587 *to++ = *from;
588 *size /= interleave;
589 }
590
591 /* Copy object file IBFD onto OBFD. */
592
593 static void
594 copy_object (ibfd, obfd)
595 bfd *ibfd;
596 bfd *obfd;
597 {
598 bfd_vma start;
599 long symcount;
600 asection **osections = NULL;
601 bfd_size_type *gaps = NULL;
602 bfd_size_type max_gap = 0;
603
604 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
605 {
606 nonfatal (bfd_get_filename (obfd));
607 }
608
609 if (verbose)
610 printf ("copy from %s(%s) to %s(%s)\n",
611 bfd_get_filename(ibfd), bfd_get_target(ibfd),
612 bfd_get_filename(obfd), bfd_get_target(obfd));
613
614 if (set_start_set)
615 start = set_start;
616 else
617 start = bfd_get_start_address (ibfd);
618 start += adjust_start;
619
620 if (!bfd_set_start_address (obfd, start)
621 || !bfd_set_file_flags (obfd,
622 (bfd_get_file_flags (ibfd)
623 & bfd_applicable_file_flags (obfd))))
624 {
625 nonfatal (bfd_get_filename (ibfd));
626 }
627
628 /* Copy architecture of input file to output file */
629 if (!bfd_set_arch_mach (obfd, bfd_get_arch (ibfd),
630 bfd_get_mach (ibfd)))
631 {
632 fprintf (stderr,
633 "Warning: Output file cannot represent architecture %s\n",
634 bfd_printable_arch_mach (bfd_get_arch (ibfd),
635 bfd_get_mach (ibfd)));
636 }
637 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
638 {
639 nonfatal (bfd_get_filename(ibfd));
640 }
641
642 if (isympp)
643 free (isympp);
644 if (osympp != isympp)
645 free (osympp);
646
647 /* bfd mandates that all output sections be created and sizes set before
648 any output is done. Thus, we traverse all sections multiple times. */
649 bfd_map_over_sections (ibfd, setup_section, (void *) obfd);
650
651 if (add_sections != NULL)
652 {
653 struct section_add *padd;
654 struct section_list *pset;
655
656 for (padd = add_sections; padd != NULL; padd = padd->next)
657 {
658 padd->section = bfd_make_section (obfd, padd->name);
659 if (padd->section == NULL)
660 {
661 fprintf (stderr, "%s: can't create section `%s': %s\n",
662 program_name, padd->name,
663 bfd_errmsg (bfd_get_error ()));
664 status = 1;
665 return;
666 }
667 else
668 {
669 flagword flags;
670
671 if (! bfd_set_section_size (obfd, padd->section, padd->size))
672 nonfatal (bfd_get_filename (obfd));
673
674 pset = find_section_list (padd->name, false);
675 if (pset != NULL)
676 pset->used = true;
677
678 if (pset != NULL && pset->set_flags)
679 flags = pset->flags | SEC_HAS_CONTENTS;
680 else
681 flags = SEC_HAS_CONTENTS | SEC_READONLY | SEC_DATA;
682 if (! bfd_set_section_flags (obfd, padd->section, flags))
683 nonfatal (bfd_get_filename (obfd));
684
685 if (pset != NULL
686 && (pset->adjust == adjust_vma
687 || pset->adjust == set_vma))
688 {
689 if (! bfd_set_section_vma (obfd, padd->section, pset->val))
690 nonfatal (bfd_get_filename (obfd));
691 }
692 }
693 }
694 }
695
696 if (gap_fill_set || pad_to_set)
697 {
698 asection **set;
699 unsigned int c, i;
700
701 /* We must fill in gaps between the sections and/or we must pad
702 the last section to a specified address. We do this by
703 grabbing a list of the sections, sorting them by VMA, and
704 increasing the section sizes as required to fill the gaps.
705 We write out the gap contents below. */
706
707 c = bfd_count_sections (obfd);
708 osections = (asection **) xmalloc (c * sizeof (asection *));
709 set = osections;
710 bfd_map_over_sections (obfd, get_sections, (void *) &set);
711
712 qsort (osections, c, sizeof (asection *), compare_section_vma);
713
714 gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type));
715 memset (gaps, 0, c * sizeof (bfd_size_type));
716
717 if (gap_fill_set)
718 {
719 for (i = 0; i < c - 1; i++)
720 {
721 flagword flags;
722 bfd_size_type size;
723 bfd_vma gap_start, gap_stop;
724
725 flags = bfd_get_section_flags (obfd, osections[i]);
726 if ((flags & SEC_HAS_CONTENTS) == 0
727 || (flags & SEC_LOAD) == 0)
728 continue;
729
730 size = bfd_section_size (obfd, osections[i]);
731 gap_start = bfd_section_vma (obfd, osections[i]) + size;
732 gap_stop = bfd_section_vma (obfd, osections[i + 1]);
733 if (gap_start < gap_stop)
734 {
735 if (! bfd_set_section_size (obfd, osections[i],
736 size + (gap_stop - gap_start)))
737 {
738 fprintf (stderr, "%s: Can't fill gap after %s: %s\n",
739 program_name,
740 bfd_get_section_name (obfd, osections[i]),
741 bfd_errmsg (bfd_get_error()));
742 status = 1;
743 break;
744 }
745 gaps[i] = gap_stop - gap_start;
746 if (max_gap < gap_stop - gap_start)
747 max_gap = gap_stop - gap_start;
748 }
749 }
750 }
751
752 if (pad_to_set)
753 {
754 bfd_vma vma;
755 bfd_size_type size;
756
757 vma = bfd_section_vma (obfd, osections[c - 1]);
758 size = bfd_section_size (obfd, osections[c - 1]);
759 if (vma + size < pad_to)
760 {
761 if (! bfd_set_section_size (obfd, osections[c - 1],
762 pad_to - vma))
763 {
764 fprintf (stderr, "%s: Can't add padding to %s: %s\n",
765 program_name,
766 bfd_get_section_name (obfd, osections[c - 1]),
767 bfd_errmsg (bfd_get_error ()));
768 status = 1;
769 }
770 else
771 {
772 gaps[c - 1] = pad_to - (vma + size);
773 if (max_gap < pad_to - (vma + size))
774 max_gap = pad_to - (vma + size);
775 }
776 }
777 }
778 }
779
780 /* Symbol filtering must happen after the output sections have
781 been created, but before their contents are set. */
782 if (strip_symbols == strip_all)
783 {
784 osympp = isympp = NULL;
785 symcount = 0;
786 }
787 else
788 {
789 long symsize;
790 PTR dhandle = NULL;
791
792 symsize = bfd_get_symtab_upper_bound (ibfd);
793 if (symsize < 0)
794 {
795 nonfatal (bfd_get_filename (ibfd));
796 }
797
798 osympp = isympp = (asymbol **) xmalloc (symsize);
799 symcount = bfd_canonicalize_symtab (ibfd, isympp);
800 if (symcount < 0)
801 {
802 nonfatal (bfd_get_filename (ibfd));
803 }
804
805 if (convert_debugging)
806 dhandle = read_debugging_info (ibfd, isympp, symcount);
807
808 if (strip_symbols == strip_debug
809 || strip_symbols == strip_unneeded
810 || discard_locals != locals_undef
811 || strip_specific_list != NULL
812 || keep_specific_list != NULL
813 || localize_specific_list != NULL
814 || weaken_specific_list != NULL
815 || sections_removed
816 || convert_debugging
817 || change_leading_char
818 || remove_leading_char
819 || weaken)
820 {
821 /* Mark symbols used in output relocations so that they
822 are kept, even if they are local labels or static symbols.
823
824 Note we iterate over the input sections examining their
825 relocations since the relocations for the output sections
826 haven't been set yet. mark_symbols_used_in_relocations will
827 ignore input sections which have no corresponding output
828 section. */
829 bfd_map_over_sections (ibfd,
830 mark_symbols_used_in_relocations,
831 (PTR)isympp);
832 osympp = (asymbol **) xmalloc ((symcount + 1) * sizeof (asymbol *));
833 symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount);
834 }
835
836 if (convert_debugging && dhandle != NULL)
837 {
838 if (! write_debugging_info (obfd, dhandle, &symcount, &osympp))
839 {
840 status = 1;
841 return;
842 }
843 }
844 }
845
846 bfd_set_symtab (obfd, osympp, symcount);
847
848 /* This has to happen after the symbol table has been set. */
849 bfd_map_over_sections (ibfd, copy_section, (void *) obfd);
850
851 if (add_sections != NULL)
852 {
853 struct section_add *padd;
854
855 for (padd = add_sections; padd != NULL; padd = padd->next)
856 {
857 if (! bfd_set_section_contents (obfd, padd->section,
858 (PTR) padd->contents,
859 (file_ptr) 0,
860 (bfd_size_type) padd->size))
861 nonfatal (bfd_get_filename (obfd));
862 }
863 }
864
865 if (gap_fill_set || pad_to_set)
866 {
867 bfd_byte *buf;
868 int c, i;
869
870 /* Fill in the gaps. */
871
872 if (max_gap > 8192)
873 max_gap = 8192;
874 buf = (bfd_byte *) xmalloc (max_gap);
875 memset (buf, gap_fill, (size_t) max_gap);
876
877 c = bfd_count_sections (obfd);
878 for (i = 0; i < c; i++)
879 {
880 if (gaps[i] != 0)
881 {
882 bfd_size_type left;
883 file_ptr off;
884
885 left = gaps[i];
886 off = bfd_section_size (obfd, osections[i]) - left;
887 while (left > 0)
888 {
889 bfd_size_type now;
890
891 if (left > 8192)
892 now = 8192;
893 else
894 now = left;
895 if (! bfd_set_section_contents (obfd, osections[i], buf,
896 off, now))
897 {
898 nonfatal (bfd_get_filename (obfd));
899 }
900 left -= now;
901 off += now;
902 }
903 }
904 }
905 }
906
907 /* Allow the BFD backend to copy any private data it understands
908 from the input BFD to the output BFD. This is done last to
909 permit the routine to look at the filtered symbol table, which is
910 important for the ECOFF code at least. */
911 if (!bfd_copy_private_bfd_data (ibfd, obfd))
912 {
913 fprintf (stderr, "%s: %s: error copying private BFD data: %s\n",
914 program_name, bfd_get_filename (obfd),
915 bfd_errmsg (bfd_get_error ()));
916 status = 1;
917 return;
918 }
919 }
920
921 /* Read each archive element in turn from IBFD, copy the
922 contents to temp file, and keep the temp file handle. */
923
924 static void
925 copy_archive (ibfd, obfd, output_target)
926 bfd *ibfd;
927 bfd *obfd;
928 const char *output_target;
929 {
930 struct name_list
931 {
932 struct name_list *next;
933 char *name;
934 bfd *obfd;
935 } *list, *l;
936 bfd **ptr = &obfd->archive_head;
937 bfd *this_element;
938 char *dir = make_tempname (bfd_get_filename (obfd));
939
940 /* Make a temp directory to hold the contents. */
941 #if defined (_WIN32) && !defined (__CYGWIN32__)
942 if (mkdir (dir) != 0)
943 #else
944 if (mkdir (dir, 0700) != 0)
945 #endif
946 {
947 fatal ("cannot mkdir %s for archive copying (error: %s)",
948 dir, strerror (errno));
949 }
950 obfd->has_armap = ibfd->has_armap;
951
952 list = NULL;
953
954 this_element = bfd_openr_next_archived_file (ibfd, NULL);
955 while (this_element != (bfd *) NULL)
956 {
957 /* Create an output file for this member. */
958 char *output_name = concat (dir, "/", bfd_get_filename(this_element),
959 (char *) NULL);
960 bfd *output_bfd = bfd_openw (output_name, output_target);
961 bfd *last_element;
962
963 l = (struct name_list *) xmalloc (sizeof (struct name_list));
964 l->name = output_name;
965 l->next = list;
966 list = l;
967
968 if (output_bfd == (bfd *) NULL)
969 {
970 nonfatal (output_name);
971 }
972 if (!bfd_set_format (obfd, bfd_get_format (ibfd)))
973 {
974 nonfatal (bfd_get_filename (obfd));
975 }
976
977 if (bfd_check_format (this_element, bfd_object) == true)
978 {
979 copy_object (this_element, output_bfd);
980 }
981
982 bfd_close (output_bfd);
983
984 /* Open the newly output file and attach to our list. */
985 output_bfd = bfd_openr (output_name, output_target);
986
987 l->obfd = output_bfd;
988
989 *ptr = output_bfd;
990 ptr = &output_bfd->next;
991
992 last_element = this_element;
993
994 this_element = bfd_openr_next_archived_file (ibfd, last_element);
995
996 bfd_close (last_element);
997 }
998 *ptr = (bfd *) NULL;
999
1000 if (!bfd_close (obfd))
1001 {
1002 nonfatal (bfd_get_filename (obfd));
1003 }
1004
1005 if (!bfd_close (ibfd))
1006 {
1007 nonfatal (bfd_get_filename (ibfd));
1008 }
1009
1010 /* Delete all the files that we opened. */
1011 for (l = list; l != NULL; l = l->next)
1012 {
1013 bfd_close (l->obfd);
1014 unlink (l->name);
1015 }
1016 rmdir (dir);
1017 }
1018
1019 /* The top-level control. */
1020
1021 static void
1022 copy_file (input_filename, output_filename, input_target, output_target)
1023 const char *input_filename;
1024 const char *output_filename;
1025 const char *input_target;
1026 const char *output_target;
1027 {
1028 bfd *ibfd;
1029 char **matching;
1030
1031 /* To allow us to do "strip *" without dying on the first
1032 non-object file, failures are nonfatal. */
1033
1034 ibfd = bfd_openr (input_filename, input_target);
1035 if (ibfd == NULL)
1036 {
1037 nonfatal (input_filename);
1038 }
1039
1040 if (bfd_check_format (ibfd, bfd_archive))
1041 {
1042 bfd *obfd;
1043
1044 /* bfd_get_target does not return the correct value until
1045 bfd_check_format succeeds. */
1046 if (output_target == NULL)
1047 output_target = bfd_get_target (ibfd);
1048
1049 obfd = bfd_openw (output_filename, output_target);
1050 if (obfd == NULL)
1051 {
1052 nonfatal (output_filename);
1053 }
1054 copy_archive (ibfd, obfd, output_target);
1055 }
1056 else if (bfd_check_format_matches (ibfd, bfd_object, &matching))
1057 {
1058 bfd *obfd;
1059
1060 /* bfd_get_target does not return the correct value until
1061 bfd_check_format succeeds. */
1062 if (output_target == NULL)
1063 output_target = bfd_get_target (ibfd);
1064
1065 obfd = bfd_openw (output_filename, output_target);
1066 if (obfd == NULL)
1067 {
1068 nonfatal (output_filename);
1069 }
1070
1071 copy_object (ibfd, obfd);
1072
1073 if (!bfd_close (obfd))
1074 {
1075 nonfatal (output_filename);
1076 }
1077
1078 if (!bfd_close (ibfd))
1079 {
1080 nonfatal (input_filename);
1081 }
1082 }
1083 else
1084 {
1085 bfd_nonfatal (input_filename);
1086 if (bfd_get_error () == bfd_error_file_ambiguously_recognized)
1087 {
1088 list_matching_formats (matching);
1089 free (matching);
1090 }
1091 status = 1;
1092 }
1093 }
1094
1095 /* Create a section in OBFD with the same name and attributes
1096 as ISECTION in IBFD. */
1097
1098 static void
1099 setup_section (ibfd, isection, obfdarg)
1100 bfd *ibfd;
1101 sec_ptr isection;
1102 PTR obfdarg;
1103 {
1104 bfd *obfd = (bfd *) obfdarg;
1105 struct section_list *p;
1106 sec_ptr osection;
1107 bfd_vma vma;
1108 bfd_vma lma;
1109 flagword flags;
1110 char *err;
1111
1112 if ((bfd_get_section_flags (ibfd, isection) & SEC_DEBUGGING) != 0
1113 && (strip_symbols == strip_debug
1114 || strip_symbols == strip_unneeded
1115 || strip_symbols == strip_all
1116 || discard_locals == locals_all
1117 || convert_debugging))
1118 return;
1119
1120 p = find_section_list (bfd_section_name (ibfd, isection), false);
1121 if (p != NULL)
1122 p->used = true;
1123
1124 if (p != NULL && p->remove)
1125 return;
1126
1127 osection = bfd_make_section_anyway (obfd, bfd_section_name (ibfd, isection));
1128 if (osection == NULL)
1129 {
1130 err = "making";
1131 goto loser;
1132 }
1133
1134 if (!bfd_set_section_size (obfd,
1135 osection,
1136 bfd_section_size (ibfd, isection)))
1137 {
1138 err = "size";
1139 goto loser;
1140 }
1141
1142 vma = bfd_section_vma (ibfd, isection);
1143 if (p != NULL && p->adjust == adjust_vma)
1144 vma += p->val;
1145 else if (p != NULL && p->adjust == set_vma)
1146 vma = p->val;
1147 else
1148 vma += adjust_section_vma;
1149 if (! bfd_set_section_vma (obfd, osection, vma))
1150 {
1151 err = "vma";
1152 goto loser;
1153 }
1154
1155 lma = isection->lma;
1156 if (p != NULL && p->adjust == adjust_vma)
1157 lma += p->val;
1158 else if (p != NULL && p->adjust == set_vma)
1159 lma = p->val;
1160 else
1161 lma += adjust_section_vma;
1162 osection->lma = lma;
1163
1164 if (bfd_set_section_alignment (obfd,
1165 osection,
1166 bfd_section_alignment (ibfd, isection))
1167 == false)
1168 {
1169 err = "alignment";
1170 goto loser;
1171 }
1172
1173 flags = bfd_get_section_flags (ibfd, isection);
1174 if (p != NULL && p->set_flags)
1175 flags = p->flags | (flags & SEC_HAS_CONTENTS);
1176 if (!bfd_set_section_flags (obfd, osection, flags))
1177 {
1178 err = "flags";
1179 goto loser;
1180 }
1181
1182 /* This used to be mangle_section; we do here to avoid using
1183 bfd_get_section_by_name since some formats allow multiple
1184 sections with the same name. */
1185 isection->output_section = osection;
1186 isection->output_offset = 0;
1187
1188 /* Allow the BFD backend to copy any private data it understands
1189 from the input section to the output section. */
1190 if (!bfd_copy_private_section_data (ibfd, isection, obfd, osection))
1191 {
1192 err = "private data";
1193 goto loser;
1194 }
1195
1196 /* All went well */
1197 return;
1198
1199 loser:
1200 fprintf (stderr, "%s: %s: section `%s': error in %s: %s\n",
1201 program_name,
1202 bfd_get_filename (ibfd), bfd_section_name (ibfd, isection),
1203 err, bfd_errmsg (bfd_get_error ()));
1204 status = 1;
1205 }
1206
1207 /* Copy the data of input section ISECTION of IBFD
1208 to an output section with the same name in OBFD.
1209 If stripping then don't copy any relocation info. */
1210
1211 static void
1212 copy_section (ibfd, isection, obfdarg)
1213 bfd *ibfd;
1214 sec_ptr isection;
1215 PTR obfdarg;
1216 {
1217 bfd *obfd = (bfd *) obfdarg;
1218 struct section_list *p;
1219 arelent **relpp;
1220 long relcount;
1221 sec_ptr osection;
1222 bfd_size_type size;
1223
1224 if ((bfd_get_section_flags (ibfd, isection) & SEC_DEBUGGING) != 0
1225 && (strip_symbols == strip_debug
1226 || strip_symbols == strip_unneeded
1227 || strip_symbols == strip_all
1228 || discard_locals == locals_all
1229 || convert_debugging))
1230 {
1231 return;
1232 }
1233
1234 p = find_section_list (bfd_section_name (ibfd, isection), false);
1235
1236 if (p != NULL && p->remove)
1237 return;
1238
1239 osection = isection->output_section;
1240 size = bfd_get_section_size_before_reloc (isection);
1241
1242 if (size == 0 || osection == 0)
1243 return;
1244
1245 if (strip_symbols == strip_all)
1246 bfd_set_reloc (obfd, osection, (arelent **) NULL, 0);
1247 else
1248 {
1249 long relsize;
1250
1251 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
1252 if (relsize < 0)
1253 {
1254 nonfatal (bfd_get_filename (ibfd));
1255 }
1256 if (relsize == 0)
1257 bfd_set_reloc (obfd, osection, (arelent **) NULL, 0);
1258 else
1259 {
1260 relpp = (arelent **) xmalloc (relsize);
1261 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp);
1262 if (relcount < 0)
1263 {
1264 nonfatal (bfd_get_filename (ibfd));
1265 }
1266 bfd_set_reloc (obfd, osection, relpp, relcount);
1267 }
1268 }
1269
1270 isection->_cooked_size = isection->_raw_size;
1271 isection->reloc_done = true;
1272
1273 if (bfd_get_section_flags (ibfd, isection) & SEC_HAS_CONTENTS)
1274 {
1275 PTR memhunk = (PTR) xmalloc ((unsigned) size);
1276
1277 if (!bfd_get_section_contents (ibfd, isection, memhunk, (file_ptr) 0,
1278 size))
1279 {
1280 nonfatal (bfd_get_filename (ibfd));
1281 }
1282
1283 if (copy_byte >= 0)
1284 {
1285 filter_bytes (memhunk, &size);
1286 /* The section has gotten smaller. */
1287 if (!bfd_set_section_size (obfd, osection, size))
1288 nonfatal (bfd_get_filename (obfd));
1289 }
1290
1291 if (!bfd_set_section_contents (obfd, osection, memhunk, (file_ptr) 0,
1292 size))
1293 {
1294 nonfatal (bfd_get_filename (obfd));
1295 }
1296 free (memhunk);
1297 }
1298 else if (p != NULL && p->set_flags && (p->flags & SEC_HAS_CONTENTS) != 0)
1299 {
1300 PTR memhunk = (PTR) xmalloc ((unsigned) size);
1301
1302 /* We don't permit the user to turn off the SEC_HAS_CONTENTS
1303 flag--they can just remove the section entirely and add it
1304 back again. However, we do permit them to turn on the
1305 SEC_HAS_CONTENTS flag, and take it to mean that the section
1306 contents should be zeroed out. */
1307
1308 memset (memhunk, 0, size);
1309 if (! bfd_set_section_contents (obfd, osection, memhunk, (file_ptr) 0,
1310 size))
1311 nonfatal (bfd_get_filename (obfd));
1312 free (memhunk);
1313 }
1314 }
1315
1316 /* Get all the sections. This is used when --gap-fill or --pad-to is
1317 used. */
1318
1319 static void
1320 get_sections (obfd, osection, secppparg)
1321 bfd *obfd;
1322 asection *osection;
1323 PTR secppparg;
1324 {
1325 asection ***secppp = (asection ***) secppparg;
1326
1327 **secppp = osection;
1328 ++(*secppp);
1329 }
1330
1331 /* Sort sections by VMA. This is called via qsort, and is used when
1332 --gap-fill or --pad-to is used. We force non loadable or empty
1333 sections to the front, where they are easier to ignore. */
1334
1335 static int
1336 compare_section_vma (arg1, arg2)
1337 const PTR arg1;
1338 const PTR arg2;
1339 {
1340 const asection **sec1 = (const asection **) arg1;
1341 const asection **sec2 = (const asection **) arg2;
1342 flagword flags1, flags2;
1343
1344 /* Sort non loadable sections to the front. */
1345 flags1 = (*sec1)->flags;
1346 flags2 = (*sec2)->flags;
1347 if ((flags1 & SEC_HAS_CONTENTS) == 0
1348 || (flags1 & SEC_LOAD) == 0)
1349 {
1350 if ((flags2 & SEC_HAS_CONTENTS) != 0
1351 && (flags2 & SEC_LOAD) != 0)
1352 return -1;
1353 }
1354 else
1355 {
1356 if ((flags2 & SEC_HAS_CONTENTS) == 0
1357 || (flags2 & SEC_LOAD) == 0)
1358 return 1;
1359 }
1360
1361 /* Sort sections by VMA. */
1362 if ((*sec1)->vma > (*sec2)->vma)
1363 return 1;
1364 else if ((*sec1)->vma < (*sec2)->vma)
1365 return -1;
1366
1367 /* Sort sections with the same VMA by size. */
1368 if ((*sec1)->_raw_size > (*sec2)->_raw_size)
1369 return 1;
1370 else if ((*sec1)->_raw_size < (*sec2)->_raw_size)
1371 return -1;
1372
1373 return 0;
1374 }
1375
1376 /* Mark all the symbols which will be used in output relocations with
1377 the BSF_KEEP flag so that those symbols will not be stripped.
1378
1379 Ignore relocations which will not appear in the output file. */
1380
1381 static void
1382 mark_symbols_used_in_relocations (ibfd, isection, symbolsarg)
1383 bfd *ibfd;
1384 sec_ptr isection;
1385 PTR symbolsarg;
1386 {
1387 asymbol **symbols = (asymbol **) symbolsarg;
1388 long relsize;
1389 arelent **relpp;
1390 long relcount, i;
1391
1392 /* Ignore an input section with no corresponding output section. */
1393 if (isection->output_section == NULL)
1394 return;
1395
1396 relsize = bfd_get_reloc_upper_bound (ibfd, isection);
1397 if (relsize < 0)
1398 bfd_fatal (bfd_get_filename (ibfd));
1399
1400 if (relsize == 0)
1401 return;
1402
1403 relpp = (arelent **) xmalloc (relsize);
1404 relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols);
1405 if (relcount < 0)
1406 bfd_fatal (bfd_get_filename (ibfd));
1407
1408 /* Examine each symbol used in a relocation. If it's not one of the
1409 special bfd section symbols, then mark it with BSF_KEEP. */
1410 for (i = 0; i < relcount; i++)
1411 {
1412 if (*relpp[i]->sym_ptr_ptr != bfd_com_section_ptr->symbol
1413 && *relpp[i]->sym_ptr_ptr != bfd_abs_section_ptr->symbol
1414 && *relpp[i]->sym_ptr_ptr != bfd_und_section_ptr->symbol)
1415 (*relpp[i]->sym_ptr_ptr)->flags |= BSF_KEEP;
1416 }
1417
1418 if (relpp != NULL)
1419 free (relpp);
1420 }
1421
1422 /* Write out debugging information. */
1423
1424 static boolean
1425 write_debugging_info (obfd, dhandle, symcountp, symppp)
1426 bfd *obfd;
1427 PTR dhandle;
1428 long *symcountp;
1429 asymbol ***symppp;
1430 {
1431 if (bfd_get_flavour (obfd) == bfd_target_ieee_flavour)
1432 return write_ieee_debugging_info (obfd, dhandle);
1433
1434 if (bfd_get_flavour (obfd) == bfd_target_coff_flavour
1435 || bfd_get_flavour (obfd) == bfd_target_elf_flavour)
1436 {
1437 bfd_byte *syms, *strings;
1438 bfd_size_type symsize, stringsize;
1439 asection *stabsec, *stabstrsec;
1440
1441 if (! write_stabs_in_sections_debugging_info (obfd, dhandle, &syms,
1442 &symsize, &strings,
1443 &stringsize))
1444 return false;
1445
1446 stabsec = bfd_make_section (obfd, ".stab");
1447 stabstrsec = bfd_make_section (obfd, ".stabstr");
1448 if (stabsec == NULL
1449 || stabstrsec == NULL
1450 || ! bfd_set_section_size (obfd, stabsec, symsize)
1451 || ! bfd_set_section_size (obfd, stabstrsec, stringsize)
1452 || ! bfd_set_section_alignment (obfd, stabsec, 2)
1453 || ! bfd_set_section_alignment (obfd, stabstrsec, 0)
1454 || ! bfd_set_section_flags (obfd, stabsec,
1455 (SEC_HAS_CONTENTS
1456 | SEC_READONLY
1457 | SEC_DEBUGGING))
1458 || ! bfd_set_section_flags (obfd, stabstrsec,
1459 (SEC_HAS_CONTENTS
1460 | SEC_READONLY
1461 | SEC_DEBUGGING)))
1462 {
1463 fprintf (stderr, "%s: can't create debugging section: %s\n",
1464 bfd_get_filename (obfd), bfd_errmsg (bfd_get_error ()));
1465 return false;
1466 }
1467
1468 /* We can get away with setting the section contents now because
1469 the next thing the caller is going to do is copy over the
1470 real sections. We may someday have to split the contents
1471 setting out of this function. */
1472 if (! bfd_set_section_contents (obfd, stabsec, syms, (file_ptr) 0,
1473 symsize)
1474 || ! bfd_set_section_contents (obfd, stabstrsec, strings,
1475 (file_ptr) 0, stringsize))
1476 {
1477 fprintf (stderr, "%s: can't set debugging section contents: %s\n",
1478 bfd_get_filename (obfd), bfd_errmsg (bfd_get_error ()));
1479 return false;
1480 }
1481
1482 return true;
1483 }
1484
1485 fprintf (stderr,
1486 "%s: don't know how to write debugging information for %s\n",
1487 bfd_get_filename (obfd), bfd_get_target (obfd));
1488 return false;
1489 }
1490
1491 /* The number of bytes to copy at once. */
1492 #define COPY_BUF 8192
1493
1494 /* Copy file FROM to file TO, performing no translations.
1495 Return 0 if ok, -1 if error. */
1496
1497 static int
1498 simple_copy (from, to)
1499 const char *from;
1500 const char *to;
1501 {
1502 int fromfd, tofd, nread;
1503 int saved;
1504 char buf[COPY_BUF];
1505
1506 fromfd = open (from, O_RDONLY);
1507 if (fromfd < 0)
1508 return -1;
1509 tofd = creat (to, 0777);
1510 if (tofd < 0)
1511 {
1512 saved = errno;
1513 close (fromfd);
1514 errno = saved;
1515 return -1;
1516 }
1517 while ((nread = read (fromfd, buf, sizeof buf)) > 0)
1518 {
1519 if (write (tofd, buf, nread) != nread)
1520 {
1521 saved = errno;
1522 close (fromfd);
1523 close (tofd);
1524 errno = saved;
1525 return -1;
1526 }
1527 }
1528 saved = errno;
1529 close (fromfd);
1530 close (tofd);
1531 if (nread < 0)
1532 {
1533 errno = saved;
1534 return -1;
1535 }
1536 return 0;
1537 }
1538
1539 #ifndef S_ISLNK
1540 #ifdef S_IFLNK
1541 #define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK)
1542 #else
1543 #define S_ISLNK(m) 0
1544 #define lstat stat
1545 #endif
1546 #endif
1547
1548 /* Rename FROM to TO, copying if TO is a link.
1549 Assumes that TO already exists, because FROM is a temp file.
1550 Return 0 if ok, -1 if error. */
1551
1552 static int
1553 smart_rename (from, to)
1554 const char *from;
1555 const char *to;
1556 {
1557 struct stat s;
1558 int ret = 0;
1559
1560 if (lstat (to, &s))
1561 return -1;
1562
1563 #if defined (_WIN32) && !defined (__CYGWIN32__)
1564 /* Win32, unlike unix, will not erase `to' in `rename(from, to)' but
1565 fail instead. Also, chown is not present. */
1566
1567 if (stat (to, &s) == 0)
1568 remove (to);
1569
1570 ret = rename (from, to);
1571 if (ret != 0)
1572 {
1573 /* We have to clean up here. */
1574 int saved = errno;
1575 fprintf (stderr, "%s: %s: ", program_name, to);
1576 errno = saved;
1577 perror ("rename");
1578 unlink (from);
1579 }
1580 #else
1581 /* Use rename only if TO is not a symbolic link and has
1582 only one hard link. */
1583 if (!S_ISLNK (s.st_mode) && s.st_nlink == 1)
1584 {
1585 ret = rename (from, to);
1586 if (ret == 0)
1587 {
1588 /* Try to preserve the permission bits and ownership of TO.
1589 First get the mode right except for the setuid bit. Then
1590 change the ownership. Then fix the setuid bit. We do
1591 the chmod before the chown because if the chown succeeds,
1592 and we are a normal user, we won't be able to do the
1593 chmod afterward. We don't bother to fix the setuid bit
1594 first because that might introduce a fleeting security
1595 problem, and because the chown will clear the setuid bit
1596 anyhow. We only fix the setuid bit if the chown
1597 succeeds, because we don't want to introduce an
1598 unexpected setuid file owned by the user running objcopy. */
1599 chmod (to, s.st_mode & 0777);
1600 if (chown (to, s.st_uid, s.st_gid) >= 0)
1601 chmod (to, s.st_mode & 07777);
1602 }
1603 else
1604 {
1605 /* We have to clean up here. */
1606 int saved = errno;
1607 fprintf (stderr, "%s: %s: ", program_name, to);
1608 errno = saved;
1609 perror ("rename");
1610 unlink (from);
1611 }
1612 }
1613 else
1614 {
1615 ret = simple_copy (from, to);
1616 if (ret != 0)
1617 {
1618 int saved = errno;
1619 fprintf (stderr, "%s: %s: ", program_name, to);
1620 errno = saved;
1621 perror ("simple_copy");
1622 }
1623 unlink (from);
1624 }
1625 #endif /* _WIN32 && !__CYGWIN32__ */
1626
1627 return ret;
1628 }
1629
1630 /* Set the times of the file DESTINATION to be the same as those in
1631 STATBUF. */
1632
1633 static void
1634 set_times (destination, statbuf)
1635 const char *destination;
1636 const struct stat *statbuf;
1637 {
1638 int result;
1639
1640 {
1641 #ifdef HAVE_GOOD_UTIME_H
1642 struct utimbuf tb;
1643
1644 tb.actime = statbuf->st_atime;
1645 tb.modtime = statbuf->st_mtime;
1646 result = utime (destination, &tb);
1647 #else /* ! HAVE_GOOD_UTIME_H */
1648 #ifndef HAVE_UTIMES
1649 long tb[2];
1650
1651 tb[0] = statbuf->st_atime;
1652 tb[1] = statbuf->st_mtime;
1653 result = utime (destination, tb);
1654 #else /* HAVE_UTIMES */
1655 struct timeval tv[2];
1656
1657 tv[0].tv_sec = statbuf->st_atime;
1658 tv[0].tv_usec = 0;
1659 tv[1].tv_sec = statbuf->st_mtime;
1660 tv[1].tv_usec = 0;
1661 result = utimes (destination, tv);
1662 #endif /* HAVE_UTIMES */
1663 #endif /* ! HAVE_GOOD_UTIME_H */
1664 }
1665
1666 if (result != 0)
1667 {
1668 fprintf (stderr, "%s: ", destination);
1669 perror ("can not set time");
1670 }
1671 }
1672
1673 static int
1674 strip_main (argc, argv)
1675 int argc;
1676 char *argv[];
1677 {
1678 char *input_target = NULL, *output_target = NULL;
1679 boolean show_version = false;
1680 boolean preserve_dates = false;
1681 int c, i;
1682 struct section_list *p;
1683 char *output_file = NULL;
1684
1685 while ((c = getopt_long (argc, argv, "I:O:F:K:N:R:o:sSpgxXVv",
1686 strip_options, (int *) 0)) != EOF)
1687 {
1688 switch (c)
1689 {
1690 case 'I':
1691 input_target = optarg;
1692 break;
1693 case 'O':
1694 output_target = optarg;
1695 break;
1696 case 'F':
1697 input_target = output_target = optarg;
1698 break;
1699 case 'R':
1700 p = find_section_list (optarg, true);
1701 p->remove = true;
1702 sections_removed = true;
1703 break;
1704 case 's':
1705 strip_symbols = strip_all;
1706 break;
1707 case 'S':
1708 case 'g':
1709 strip_symbols = strip_debug;
1710 break;
1711 case OPTION_STRIP_UNNEEDED:
1712 strip_symbols = strip_unneeded;
1713 break;
1714 case 'K':
1715 add_specific_symbol (optarg, &keep_specific_list);
1716 break;
1717 case 'N':
1718 add_specific_symbol (optarg, &strip_specific_list);
1719 break;
1720 case 'o':
1721 output_file = optarg;
1722 break;
1723 case 'p':
1724 preserve_dates = true;
1725 break;
1726 case 'x':
1727 discard_locals = locals_all;
1728 break;
1729 case 'X':
1730 discard_locals = locals_start_L;
1731 break;
1732 case 'v':
1733 verbose = true;
1734 break;
1735 case 'V':
1736 show_version = true;
1737 break;
1738 case 0:
1739 break; /* we've been given a long option */
1740 case 'h':
1741 strip_usage (stdout, 0);
1742 default:
1743 strip_usage (stderr, 1);
1744 }
1745 }
1746
1747 if (show_version)
1748 print_version ("strip");
1749
1750 /* Default is to strip all symbols. */
1751 if (strip_symbols == strip_undef
1752 && discard_locals == locals_undef
1753 && strip_specific_list == NULL)
1754 strip_symbols = strip_all;
1755
1756 if (output_target == (char *) NULL)
1757 output_target = input_target;
1758
1759 i = optind;
1760 if (i == argc
1761 || (output_file != NULL && (i + 1) < argc))
1762 strip_usage (stderr, 1);
1763
1764 for (; i < argc; i++)
1765 {
1766 int hold_status = status;
1767 struct stat statbuf;
1768 char *tmpname;
1769
1770 if (preserve_dates)
1771 {
1772 if (stat (argv[i], &statbuf) < 0)
1773 {
1774 fprintf (stderr, "%s: ", argv[i]);
1775 perror ("cannot stat");
1776 continue;
1777 }
1778 }
1779
1780 if (output_file != NULL)
1781 tmpname = output_file;
1782 else
1783 tmpname = make_tempname (argv[i]);
1784 status = 0;
1785
1786 copy_file (argv[i], tmpname, input_target, output_target);
1787 if (status == 0)
1788 {
1789 if (preserve_dates)
1790 set_times (tmpname, &statbuf);
1791 if (output_file == NULL)
1792 smart_rename (tmpname, argv[i]);
1793 status = hold_status;
1794 }
1795 else
1796 unlink (tmpname);
1797 if (output_file == NULL)
1798 free (tmpname);
1799 }
1800
1801 return 0;
1802 }
1803
1804 static int
1805 copy_main (argc, argv)
1806 int argc;
1807 char *argv[];
1808 {
1809 char *input_filename = NULL, *output_filename = NULL;
1810 char *input_target = NULL, *output_target = NULL;
1811 boolean show_version = false;
1812 boolean adjust_warn = true;
1813 boolean preserve_dates = false;
1814 int c;
1815 struct section_list *p;
1816 struct stat statbuf;
1817
1818 while ((c = getopt_long (argc, argv, "b:i:I:K:N:s:O:d:F:L:R:SpgxXVvW:",
1819 copy_options, (int *) 0)) != EOF)
1820 {
1821 switch (c)
1822 {
1823 case 'b':
1824 copy_byte = atoi(optarg);
1825 if (copy_byte < 0)
1826 {
1827 fprintf (stderr, "%s: byte number must be non-negative\n",
1828 program_name);
1829 exit (1);
1830 }
1831 break;
1832 case 'i':
1833 interleave = atoi(optarg);
1834 if (interleave < 1)
1835 {
1836 fprintf(stderr, "%s: interleave must be positive\n",
1837 program_name);
1838 exit (1);
1839 }
1840 break;
1841 case 'I':
1842 case 's': /* "source" - 'I' is preferred */
1843 input_target = optarg;
1844 break;
1845 case 'O':
1846 case 'd': /* "destination" - 'O' is preferred */
1847 output_target = optarg;
1848 break;
1849 case 'F':
1850 input_target = output_target = optarg;
1851 break;
1852 case 'R':
1853 p = find_section_list (optarg, true);
1854 p->remove = true;
1855 sections_removed = true;
1856 break;
1857 case 'S':
1858 strip_symbols = strip_all;
1859 break;
1860 case 'g':
1861 strip_symbols = strip_debug;
1862 break;
1863 case OPTION_STRIP_UNNEEDED:
1864 strip_symbols = strip_unneeded;
1865 break;
1866 case 'K':
1867 add_specific_symbol (optarg, &keep_specific_list);
1868 break;
1869 case 'N':
1870 add_specific_symbol (optarg, &strip_specific_list);
1871 break;
1872 case 'L':
1873 add_specific_symbol (optarg, &localize_specific_list);
1874 break;
1875 case 'W':
1876 add_specific_symbol (optarg, &weaken_specific_list);
1877 break;
1878 case 'p':
1879 preserve_dates = true;
1880 break;
1881 case 'x':
1882 discard_locals = locals_all;
1883 break;
1884 case 'X':
1885 discard_locals = locals_start_L;
1886 break;
1887 case 'v':
1888 verbose = true;
1889 break;
1890 case 'V':
1891 show_version = true;
1892 break;
1893 case OPTION_WEAKEN:
1894 weaken = true;
1895 break;
1896 case OPTION_ADD_SECTION:
1897 {
1898 const char *s;
1899 struct stat st;
1900 struct section_add *pa;
1901 int len;
1902 char *name;
1903 FILE *f;
1904
1905 s = strchr (optarg, '=');
1906 if (s == NULL)
1907 {
1908 fprintf (stderr,
1909 "%s: bad format for --add-section NAME=FILENAME\n",
1910 program_name);
1911 exit (1);
1912 }
1913
1914 if (stat (s + 1, &st) < 0)
1915 {
1916 fprintf (stderr, "%s: ", program_name);
1917 perror (s + 1);
1918 exit (1);
1919 }
1920
1921 pa = (struct section_add *) xmalloc (sizeof (struct section_add));
1922
1923 len = s - optarg;
1924 name = (char *) xmalloc (len + 1);
1925 strncpy (name, optarg, len);
1926 name[len] = '\0';
1927 pa->name = name;
1928
1929 pa->filename = s + 1;
1930
1931 pa->size = st.st_size;
1932
1933 pa->contents = (bfd_byte *) xmalloc (pa->size);
1934 f = fopen (pa->filename, FOPEN_RB);
1935 if (f == NULL)
1936 {
1937 fprintf (stderr, "%s: ", program_name);
1938 perror (pa->filename);
1939 exit (1);
1940 }
1941 if (fread (pa->contents, 1, pa->size, f) == 0
1942 || ferror (f))
1943 {
1944 fprintf (stderr, "%s: %s: fread failed\n",
1945 program_name, pa->filename);
1946 exit (1);
1947 }
1948 fclose (f);
1949
1950 pa->next = add_sections;
1951 add_sections = pa;
1952 }
1953 break;
1954 case OPTION_ADJUST_START:
1955 adjust_start = parse_vma (optarg, "--adjust-start");
1956 break;
1957 case OPTION_ADJUST_SECTION_VMA:
1958 {
1959 const char *s;
1960 int len;
1961 char *name;
1962
1963 s = strchr (optarg, '=');
1964 if (s == NULL)
1965 {
1966 s = strchr (optarg, '+');
1967 if (s == NULL)
1968 {
1969 s = strchr (optarg, '-');
1970 if (s == NULL)
1971 {
1972 fprintf (stderr,
1973 "%s: bad format for --adjust-section-vma\n",
1974 program_name);
1975 exit (1);
1976 }
1977 }
1978 }
1979
1980 len = s - optarg;
1981 name = (char *) xmalloc (len + 1);
1982 strncpy (name, optarg, len);
1983 name[len] = '\0';
1984
1985 p = find_section_list (name, true);
1986
1987 p->val = parse_vma (s + 1, "--adjust-section-vma");
1988
1989 if (*s == '=')
1990 p->adjust = set_vma;
1991 else
1992 {
1993 p->adjust = adjust_vma;
1994 if (*s == '-')
1995 p->val = - p->val;
1996 }
1997 }
1998 break;
1999 case OPTION_ADJUST_VMA:
2000 adjust_section_vma = parse_vma (optarg, "--adjust-vma");
2001 adjust_start = adjust_section_vma;
2002 break;
2003 case OPTION_ADJUST_WARNINGS:
2004 adjust_warn = true;
2005 break;
2006 case OPTION_CHANGE_LEADING_CHAR:
2007 change_leading_char = true;
2008 break;
2009 case OPTION_DEBUGGING:
2010 convert_debugging = true;
2011 break;
2012 case OPTION_GAP_FILL:
2013 {
2014 bfd_vma gap_fill_vma;
2015
2016 gap_fill_vma = parse_vma (optarg, "--gap-fill");
2017 gap_fill = (bfd_byte) gap_fill_vma;
2018 if ((bfd_vma) gap_fill != gap_fill_vma)
2019 {
2020 fprintf (stderr, "%s: warning: truncating gap-fill from 0x",
2021 program_name);
2022 fprintf_vma (stderr, gap_fill_vma);
2023 fprintf (stderr, "to 0x%x\n", (unsigned int) gap_fill);
2024 }
2025 gap_fill_set = true;
2026 }
2027 break;
2028 case OPTION_NO_ADJUST_WARNINGS:
2029 adjust_warn = false;
2030 break;
2031 case OPTION_PAD_TO:
2032 pad_to = parse_vma (optarg, "--pad-to");
2033 pad_to_set = true;
2034 break;
2035 case OPTION_REMOVE_LEADING_CHAR:
2036 remove_leading_char = true;
2037 break;
2038 case OPTION_SET_SECTION_FLAGS:
2039 {
2040 const char *s;
2041 int len;
2042 char *name;
2043
2044 s = strchr (optarg, '=');
2045 if (s == NULL)
2046 {
2047 fprintf (stderr, "%s: bad format for --set-section-flags\n",
2048 program_name);
2049 exit (1);
2050 }
2051
2052 len = s - optarg;
2053 name = (char *) xmalloc (len + 1);
2054 strncpy (name, optarg, len);
2055 name[len] = '\0';
2056
2057 p = find_section_list (name, true);
2058
2059 p->set_flags = true;
2060 p->flags = parse_flags (s + 1);
2061 }
2062 break;
2063 case OPTION_SET_START:
2064 set_start = parse_vma (optarg, "--set-start");
2065 set_start_set = true;
2066 break;
2067 case 0:
2068 break; /* we've been given a long option */
2069 case 'h':
2070 copy_usage (stdout, 0);
2071 default:
2072 copy_usage (stderr, 1);
2073 }
2074 }
2075
2076 if (show_version)
2077 print_version ("objcopy");
2078
2079 if (copy_byte >= interleave)
2080 {
2081 fprintf (stderr, "%s: byte number must be less than interleave\n",
2082 program_name);
2083 exit (1);
2084 }
2085
2086 if (optind == argc || optind + 2 < argc)
2087 copy_usage (stderr, 1);
2088
2089 input_filename = argv[optind];
2090 if (optind + 1 < argc)
2091 output_filename = argv[optind + 1];
2092
2093 /* Default is to strip no symbols. */
2094 if (strip_symbols == strip_undef && discard_locals == locals_undef)
2095 strip_symbols = strip_none;
2096
2097 if (output_target == (char *) NULL)
2098 output_target = input_target;
2099
2100 if (preserve_dates)
2101 {
2102 if (stat (input_filename, &statbuf) < 0)
2103 {
2104 fprintf (stderr, "%s: ", input_filename);
2105 perror ("cannot stat");
2106 exit (1);
2107 }
2108 }
2109
2110 /* If there is no destination file then create a temp and rename
2111 the result into the input. */
2112
2113 if (output_filename == (char *) NULL)
2114 {
2115 char *tmpname = make_tempname (input_filename);
2116
2117 copy_file (input_filename, tmpname, input_target, output_target);
2118 if (status == 0)
2119 {
2120 if (preserve_dates)
2121 set_times (tmpname, &statbuf);
2122 smart_rename (tmpname, input_filename);
2123 }
2124 else
2125 unlink (tmpname);
2126 }
2127 else
2128 {
2129 copy_file (input_filename, output_filename, input_target, output_target);
2130 if (status == 0 && preserve_dates)
2131 set_times (output_filename, &statbuf);
2132 }
2133
2134 if (adjust_warn)
2135 {
2136 for (p = adjust_sections; p != NULL; p = p->next)
2137 {
2138 if (! p->used && p->adjust != ignore_vma)
2139 {
2140 fprintf (stderr, "%s: warning: --adjust-section-vma %s%c0x",
2141 program_name, p->name,
2142 p->adjust == set_vma ? '=' : '+');
2143 fprintf_vma (stderr, p->val);
2144 fprintf (stderr, " never used\n");
2145 }
2146 }
2147 }
2148
2149 return 0;
2150 }
2151
2152 int
2153 main (argc, argv)
2154 int argc;
2155 char *argv[];
2156 {
2157 program_name = argv[0];
2158 xmalloc_set_program_name (program_name);
2159
2160 START_PROGRESS (program_name, 0);
2161
2162 strip_symbols = strip_undef;
2163 discard_locals = locals_undef;
2164
2165 bfd_init ();
2166 set_default_bfd_target ();
2167
2168 if (is_strip < 0)
2169 {
2170 int i = strlen (program_name);
2171 is_strip = (i >= 5 && strcmp (program_name + i - 5, "strip") == 0);
2172 }
2173
2174 if (is_strip)
2175 strip_main (argc, argv);
2176 else
2177 copy_main (argc, argv);
2178
2179 END_PROGRESS (program_name);
2180
2181 return status;
2182 }
This page took 0.072201 seconds and 5 git commands to generate.