X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=binutils%2Fobjcopy.c;h=dd16b9b0f4b181cfbc7268d3dd9583c40226d4f9;hb=02893727c56378bb9c723096a58fd6dfc6f0d02b;hp=b213132c7919ac29233697f55f65295cbba11e83;hpb=92fac5ecb0b23133848395b9883f3dede959142e;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/objcopy.c b/binutils/objcopy.c index b213132c79..dd16b9b0f4 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -1,6 +1,6 @@ /* objcopy.c -- copy object file from input to output, optionally massaging it. Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, - 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009 + 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -442,11 +442,6 @@ extern unsigned int Chunk; on by the --srec-forceS3 command line switch. */ extern bfd_boolean S3Forced; -/* Defined in bfd/binary.c. Used to set architecture and machine of input - binary files. */ -extern enum bfd_architecture bfd_external_binary_architecture; -extern unsigned long bfd_external_machine; - /* Forward declarations. */ static void setup_section (bfd *, asection *, void *); static void setup_bfd_headers (bfd *, bfd *); @@ -466,7 +461,7 @@ copy_usage (FILE *stream, int exit_status) fprintf (stream, _("\ -I --input-target Assume input file is in format \n\ -O --output-target Create an output file in format \n\ - -B --binary-architecture Set arch of output file, when input is binary\n\ + -B --binary-architecture Set output arch, when input is arch-less\n\ -F --target Set both input and output format to \n\ --debugging Convert debugging information, if possible\n\ -p --preserve-dates Copy modified/access timestamps to the output\n\ @@ -640,7 +635,7 @@ parse_flags (const char *s) { char *copy; - copy = xmalloc (len + 1); + copy = (char *) xmalloc (len + 1); strncpy (copy, s, len); copy[len] = '\0'; non_fatal (_("unrecognized section flag `%s'"), copy); @@ -669,7 +664,7 @@ find_section_list (const char *name, bfd_boolean add) if (! add) return NULL; - p = xmalloc (sizeof (struct section_list)); + p = (struct section_list *) xmalloc (sizeof (struct section_list)); p->name = name; p->used = FALSE; p->remove = FALSE; @@ -692,7 +687,7 @@ find_section_list (const char *name, bfd_boolean add) static int eq_string (const void *s1, const void *s2) { - return strcmp (s1, s2) == 0; + return strcmp ((const char *) s1, (const char *) s2) == 0; } static htab_t @@ -742,7 +737,7 @@ add_specific_symbols (const char *filename, htab_t htab) return; } - buffer = xmalloc (size + 2); + buffer = (char *) xmalloc (size + 2); f = fopen (filename, FOPEN_RT); if (f == NULL) fatal (_("cannot open '%s': %s"), filename, strerror (errno)); @@ -843,8 +838,9 @@ add_specific_symbols (const char *filename, htab_t htab) static int is_specified_symbol_predicate (void **slot, void *data) { - struct is_specified_symbol_predicate_data *d = data; - const char *slot_name = *slot; + struct is_specified_symbol_predicate_data *d = + (struct is_specified_symbol_predicate_data *) data; + const char *slot_name = (char *) *slot; if (*slot_name != '!') { @@ -1056,8 +1052,8 @@ filter_symbols (bfd *abfd, bfd *obfd, asymbol **osyms, { char *n, *ptr; - ptr = n = xmalloc (1 + strlen (prefix_symbols_string) - + strlen (name) + 1); + ptr = n = (char *) xmalloc (1 + strlen (prefix_symbols_string) + + strlen (name) + 1); if (add_leading_char) *ptr++ = bfd_get_symbol_leading_char (obfd); @@ -1208,7 +1204,7 @@ redefine_list_append (const char *cause, const char *source, const char *target) cause, target); } - new_node = xmalloc (sizeof (struct redefine_node)); + new_node = (struct redefine_node *) xmalloc (sizeof (struct redefine_node)); new_node->source = strdup (source); new_node->target = strdup (target); @@ -1236,7 +1232,7 @@ add_redefine_syms_file (const char *filename) filename, strerror (errno)); bufsize = 100; - buf = xmalloc (bufsize); + buf = (char *) xmalloc (bufsize + 1 /* For the terminating NUL. */); lineno = 1; c = getc (file); @@ -1253,7 +1249,7 @@ add_redefine_syms_file (const char *filename) if (len >= bufsize) { bufsize *= 2; - buf = xrealloc (buf, bufsize); + buf = (char *) xrealloc (buf, bufsize + 1); } c = getc (file); } @@ -1279,7 +1275,7 @@ add_redefine_syms_file (const char *filename) if (len >= bufsize) { bufsize *= 2; - buf = xrealloc (buf, bufsize); + buf = (char *) xrealloc (buf, bufsize + 1); } c = getc (file); } @@ -1364,7 +1360,7 @@ copy_unknown_object (bfd *ibfd, bfd *obfd) printf (_("copy from `%s' [unknown] to `%s' [unknown]\n"), bfd_get_archive_filename (ibfd), bfd_get_filename (obfd)); - cbuf = xmalloc (BUFSIZE); + cbuf = (char *) xmalloc (BUFSIZE); ncopied = 0; while (ncopied < size) { @@ -1400,7 +1396,7 @@ copy_unknown_object (bfd *ibfd, bfd *obfd) Returns TRUE upon success, FALSE otherwise. */ static bfd_boolean -copy_object (bfd *ibfd, bfd *obfd) +copy_object (bfd *ibfd, bfd *obfd, const bfd_arch_info_type *input_arch) { bfd_vma start; long symcount; @@ -1465,6 +1461,18 @@ copy_object (bfd *ibfd, bfd *obfd) /* Copy architecture of input file to output file. */ iarch = bfd_get_arch (ibfd); imach = bfd_get_mach (ibfd); + if (input_arch) + { + if (bfd_get_arch_info (ibfd) == NULL + || bfd_get_arch_info (ibfd)->arch == bfd_arch_unknown) + { + iarch = input_arch->arch; + imach = input_arch->mach; + } + else + non_fatal (_("Input file `%s' ignores binary architecture parameter."), + bfd_get_archive_filename (ibfd)); + } if (!bfd_set_arch_mach (obfd, iarch, imach) && (ibfd->target_defaulted || bfd_get_arch (ibfd) != bfd_get_arch (obfd))) @@ -1473,7 +1481,7 @@ copy_object (bfd *ibfd, bfd *obfd) non_fatal (_("Unable to recognise the format of the input file `%s'"), bfd_get_archive_filename (ibfd)); else - non_fatal (_("Warning: Output file cannot represent architecture `%s'"), + non_fatal (_("Output file cannot represent architecture `%s'"), bfd_printable_arch_mach (bfd_get_arch (ibfd), bfd_get_mach (ibfd))); return FALSE; @@ -1558,7 +1566,7 @@ copy_object (bfd *ibfd, bfd *obfd) return FALSE; } - osympp = isympp = xmalloc (symsize); + osympp = isympp = (asymbol **) xmalloc (symsize); symcount = bfd_canonicalize_symtab (ibfd, isympp); if (symcount < 0) { @@ -1712,13 +1720,13 @@ copy_object (bfd *ibfd, bfd *obfd) We write out the gap contents below. */ c = bfd_count_sections (obfd); - osections = xmalloc (c * sizeof (asection *)); + osections = (asection **) xmalloc (c * sizeof (asection *)); set = osections; bfd_map_over_sections (obfd, get_sections, &set); qsort (osections, c, sizeof (asection *), compare_section_lma); - gaps = xmalloc (c * sizeof (bfd_size_type)); + gaps = (bfd_size_type *) xmalloc (c * sizeof (bfd_size_type)); memset (gaps, 0, c * sizeof (bfd_size_type)); if (gap_fill_set) @@ -1819,7 +1827,7 @@ copy_object (bfd *ibfd, bfd *obfd) bfd_map_over_sections (ibfd, mark_symbols_used_in_relocations, isympp); - osympp = xmalloc ((symcount + 1) * sizeof (asymbol *)); + osympp = (asymbol **) xmalloc ((symcount + 1) * sizeof (asymbol *)); symcount = filter_symbols (ibfd, obfd, osympp, isympp, symcount); } @@ -1872,7 +1880,7 @@ copy_object (bfd *ibfd, bfd *obfd) /* Fill in the gaps. */ if (max_gap > 8192) max_gap = 8192; - buf = xmalloc (max_gap); + buf = (bfd_byte *) xmalloc (max_gap); memset (buf, gap_fill, max_gap); c = bfd_count_sections (obfd); @@ -1955,7 +1963,8 @@ copy_object (bfd *ibfd, bfd *obfd) static void copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, - bfd_boolean force_output_target) + bfd_boolean force_output_target, + const bfd_arch_info_type *input_arch) { struct name_list { @@ -1995,7 +2004,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, bfd *last_element; struct stat buf; int stat_status = 0; - bfd_boolean delete = TRUE; + bfd_boolean del = TRUE; /* Create an output file for this member. */ output_name = concat (dir, "/", @@ -2009,7 +2018,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, fatal (_("cannot create tempdir for archive copying (error: %s)"), strerror (errno)); - l = xmalloc (sizeof (struct name_list)); + l = (struct name_list *) xmalloc (sizeof (struct name_list)); l->name = output_name; l->next = list; l->obfd = NULL; @@ -2027,7 +2036,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, bfd_get_filename (this_element)); } - l = xmalloc (sizeof (struct name_list)); + l = (struct name_list *) xmalloc (sizeof (struct name_list)); l->name = output_name; l->next = list; l->obfd = NULL; @@ -2049,9 +2058,9 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, return; } - delete = ! copy_object (this_element, output_bfd); + del = ! copy_object (this_element, output_bfd, input_arch); - if (! delete + if (! del || bfd_get_arch (this_element) != bfd_arch_unknown) { if (!bfd_close (output_bfd)) @@ -2071,7 +2080,7 @@ copy_archive (bfd *ibfd, bfd *obfd, const char *output_target, output_bfd = bfd_openw (output_name, output_target); copy_unknown_element: - delete = !copy_unknown_object (this_element, output_bfd); + del = !copy_unknown_object (this_element, output_bfd); if (!bfd_close_all_done (output_bfd)) { bfd_nonfatal_message (output_name, NULL, NULL, NULL); @@ -2080,7 +2089,7 @@ copy_unknown_element: } } - if (delete) + if (del) { unlink (output_name); status = 1; @@ -2154,7 +2163,8 @@ set_long_section_mode (bfd *output_bfd, bfd *input_bfd, enum long_section_name_h static void copy_file (const char *input_filename, const char *output_filename, - const char *input_target, const char *output_target) + const char *input_target, const char *output_target, + const bfd_arch_info_type *input_arch) { bfd *ibfd; char **obj_matching; @@ -2205,7 +2215,7 @@ copy_file (const char *input_filename, const char *output_filename, /* This is a no-op on non-Coff targets. */ set_long_section_mode (obfd, ibfd, long_section_names); - copy_archive (ibfd, obfd, output_target, force_output_target); + copy_archive (ibfd, obfd, output_target, force_output_target, input_arch); } else if (bfd_check_format_matches (ibfd, bfd_object, &obj_matching)) { @@ -2227,7 +2237,7 @@ copy_file (const char *input_filename, const char *output_filename, /* This is a no-op on non-Coff targets. */ set_long_section_mode (obfd, ibfd, long_section_names); - if (! copy_object (ibfd, obfd)) + if (! copy_object (ibfd, obfd, input_arch)) status = 1; if (!bfd_close (obfd)) @@ -2285,28 +2295,28 @@ static void add_section_rename (const char * old_name, const char * new_name, flagword flags) { - section_rename * rename; + section_rename * srename; /* Check for conflicts first. */ - for (rename = section_rename_list; rename != NULL; rename = rename->next) - if (strcmp (rename->old_name, old_name) == 0) + for (srename = section_rename_list; srename != NULL; srename = srename->next) + if (strcmp (srename->old_name, old_name) == 0) { /* Silently ignore duplicate definitions. */ - if (strcmp (rename->new_name, new_name) == 0 - && rename->flags == flags) + if (strcmp (srename->new_name, new_name) == 0 + && srename->flags == flags) return; fatal (_("Multiple renames of section %s"), old_name); } - rename = xmalloc (sizeof (* rename)); + srename = (section_rename *) xmalloc (sizeof (* srename)); - rename->old_name = old_name; - rename->new_name = new_name; - rename->flags = flags; - rename->next = section_rename_list; + srename->old_name = old_name; + srename->new_name = new_name; + srename->flags = flags; + srename->next = section_rename_list; - section_rename_list = rename; + section_rename_list = srename; } /* Check the section rename list for a new name of the input section @@ -2318,18 +2328,18 @@ find_section_rename (bfd * ibfd ATTRIBUTE_UNUSED, sec_ptr isection, flagword * returned_flags) { const char * old_name = bfd_section_name (ibfd, isection); - section_rename * rename; + section_rename * srename; /* Default to using the flags of the input section. */ * returned_flags = bfd_get_section_flags (ibfd, isection); - for (rename = section_rename_list; rename != NULL; rename = rename->next) - if (strcmp (rename->old_name, old_name) == 0) + for (srename = section_rename_list; srename != NULL; srename = srename->next) + if (strcmp (srename->old_name, old_name) == 0) { - if (rename->flags != (flagword) -1) - * returned_flags = rename->flags; + if (srename->flags != (flagword) -1) + * returned_flags = srename->flags; - return rename->new_name; + return srename->new_name; } return old_name; @@ -2361,7 +2371,7 @@ setup_bfd_headers (bfd *ibfd, bfd *obfd) static void setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) { - bfd *obfd = obfdarg; + bfd *obfd = (bfd *) obfdarg; struct section_list *p; sec_ptr osection; bfd_size_type size; @@ -2394,7 +2404,7 @@ setup_section (bfd *ibfd, sec_ptr isection, void *obfdarg) { char *n; - n = xmalloc (strlen (prefix) + strlen (name) + 1); + n = (char *) xmalloc (strlen (prefix) + strlen (name) + 1); strcpy (n, prefix); strcat (n, name); name = n; @@ -2531,7 +2541,7 @@ loser: static void copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg) { - bfd *obfd = obfdarg; + bfd *obfd = (bfd *) obfdarg; struct section_list *p; arelent **relpp; long relcount; @@ -2588,7 +2598,7 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg) bfd_set_reloc (obfd, osection, NULL, 0); else { - relpp = xmalloc (relsize); + relpp = (arelent **) xmalloc (relsize); relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, isympp); if (relcount < 0) { @@ -2606,7 +2616,7 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg) long temp_relcount = 0; long i; - temp_relpp = xmalloc (relsize); + temp_relpp = (arelent **) xmalloc (relsize); for (i = 0; i < relcount; i++) if (is_specified_symbol (bfd_asymbol_name (*relpp[i]->sym_ptr_ptr), keep_specific_htab)) @@ -2663,7 +2673,7 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg) { /* Keep only every `copy_byte'th byte in MEMHUNK. */ char *from = (char *) memhunk + copy_byte; - char *to = memhunk; + char *to = (char *) memhunk; char *end = (char *) memhunk + size; for (; from < end; from += interleave) @@ -2708,7 +2718,7 @@ copy_section (bfd *ibfd, sec_ptr isection, void *obfdarg) static void get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg) { - asection ***secppp = secppparg; + asection ***secppp = (asection ***) secppparg; **secppp = osection; ++(*secppp); @@ -2721,8 +2731,8 @@ get_sections (bfd *obfd ATTRIBUTE_UNUSED, asection *osection, void *secppparg) static int compare_section_lma (const void *arg1, const void *arg2) { - const asection *const *sec1 = arg1; - const asection *const *sec2 = arg2; + const asection *const *sec1 = (const asection * const *) arg1; + const asection *const *sec2 = (const asection * const *) arg2; flagword flags1, flags2; /* Sort non loadable sections to the front. */ @@ -2765,7 +2775,7 @@ compare_section_lma (const void *arg1, const void *arg2) static void mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg) { - asymbol **symbols = symbolsarg; + asymbol **symbols = (asymbol **) symbolsarg; long relsize; arelent **relpp; long relcount, i; @@ -2786,7 +2796,7 @@ mark_symbols_used_in_relocations (bfd *ibfd, sec_ptr isection, void *symbolsarg) if (relsize == 0) return; - relpp = xmalloc (relsize); + relpp = (arelent **) xmalloc (relsize); relcount = bfd_canonicalize_reloc (ibfd, isection, relpp, symbols); if (relcount < 0) bfd_fatal (bfd_get_filename (ibfd)); @@ -3008,7 +3018,7 @@ strip_main (int argc, char *argv[]) } status = 0; - copy_file (argv[i], tmpname, input_target, output_target); + copy_file (argv[i], tmpname, input_target, output_target, NULL); if (status == 0) { if (preserve_dates) @@ -3143,7 +3153,6 @@ convert_efi_target (char *efi) static int copy_main (int argc, char *argv[]) { - char * binary_architecture = NULL; char *input_filename = NULL; char *output_filename = NULL; char *tmpname; @@ -3155,6 +3164,7 @@ copy_main (int argc, char *argv[]) int c; struct section_list *p; struct stat statbuf; + const bfd_arch_info_type *input_arch = NULL; while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:G:R:SpgxXHhVvW:w", copy_options, (int *) 0)) != EOF) @@ -3168,7 +3178,9 @@ copy_main (int argc, char *argv[]) break; case 'B': - binary_architecture = optarg; + input_arch = bfd_scan_arch (optarg); + if (input_arch == NULL) + fatal (_("architecture %s unknown"), optarg); break; case 'i': @@ -3312,17 +3324,17 @@ copy_main (int argc, char *argv[]) break; } - pa = xmalloc (sizeof (struct section_add)); + pa = (struct section_add *) xmalloc (sizeof (struct section_add)); len = s - optarg; - name = xmalloc (len + 1); + name = (char *) xmalloc (len + 1); strncpy (name, optarg, len); name[len] = '\0'; pa->name = name; pa->filename = s + 1; pa->size = size; - pa->contents = xmalloc (size); + pa->contents = (bfd_byte *) xmalloc (size); f = fopen (pa->filename, FOPEN_RB); @@ -3382,7 +3394,7 @@ copy_main (int argc, char *argv[]) } len = s - optarg; - name = xmalloc (len + 1); + name = (char *) xmalloc (len + 1); strncpy (name, optarg, len); name[len] = '\0'; @@ -3480,13 +3492,13 @@ copy_main (int argc, char *argv[]) fatal (_("bad format for %s"), "--redefine-sym"); len = s - optarg; - source = xmalloc (len + 1); + source = (char *) xmalloc (len + 1); strncpy (source, optarg, len); source[len] = '\0'; nextarg = s + 1; len = strlen (nextarg); - target = xmalloc (len + 1); + target = (char *) xmalloc (len + 1); strcpy (target, nextarg); redefine_list_append ("--redefine-sym", source, target); @@ -3511,7 +3523,7 @@ copy_main (int argc, char *argv[]) fatal (_("bad format for %s"), "--set-section-flags"); len = s - optarg; - name = xmalloc (len + 1); + name = (char *) xmalloc (len + 1); strncpy (name, optarg, len); name[len] = '\0'; @@ -3538,7 +3550,7 @@ copy_main (int argc, char *argv[]) if (len == 0) fatal (_("bad format for %s"), "--rename-section"); - old_name = xmalloc (len + 1); + old_name = (char *) xmalloc (len + 1); strncpy (old_name, optarg, len); old_name[len] = 0; @@ -3558,7 +3570,7 @@ copy_main (int argc, char *argv[]) if (len == 0) fatal (_("bad format for %s"), "--rename-section"); - new_name = xmalloc (len + 1); + new_name = (char *) xmalloc (len + 1); strncpy (new_name, eq, len); new_name[len] = 0; @@ -3823,29 +3835,6 @@ copy_main (int argc, char *argv[]) convert_efi_target (efi); } - if (binary_architecture != NULL) - { - if (input_target && strcmp (input_target, "binary") == 0) - { - const bfd_arch_info_type * temp_arch_info; - - temp_arch_info = bfd_scan_arch (binary_architecture); - - if (temp_arch_info != NULL) - { - bfd_external_binary_architecture = temp_arch_info->arch; - bfd_external_machine = temp_arch_info->mach; - } - else - fatal (_("architecture %s unknown"), binary_architecture); - } - else - { - non_fatal (_("Warning: input target 'binary' required for binary architecture parameter.")); - non_fatal (_(" Argument %s ignored"), binary_architecture); - } - } - if (preserve_dates) if (stat (input_filename, & statbuf) < 0) fatal (_("warning: could not locate '%s'. System error message: %s"), @@ -3862,7 +3851,7 @@ copy_main (int argc, char *argv[]) fatal (_("warning: could not create temporary file whilst copying '%s', (error: %s)"), input_filename, strerror (errno)); - copy_file (input_filename, tmpname, input_target, output_target); + copy_file (input_filename, tmpname, input_target, output_target, input_arch); if (status == 0) { if (preserve_dates)