From 43a0748c7811bf542e8a9f020292a991db0bfa1a Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Tue, 13 Mar 2001 00:08:35 +0000 Subject: [PATCH] Add --binary-architecture switch to objcopy to allow the output architecture to be set when the input file type is binary. --- bfd/ChangeLog | 6 ++++++ bfd/binary.c | 11 +++++++++++ binutils/ChangeLog | 9 +++++++++ binutils/NEWS | 5 +++++ binutils/binutils.texi | 12 ++++++++++++ binutils/objcopy.c | 36 ++++++++++++++++++++++++++++++++---- 6 files changed, 75 insertions(+), 4 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 136fdab968..99506d163e 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,9 @@ +2001-03-12 Stefan Geuken + + * binary.c (bfd_external_binary_architecture): Declare. + (binary_object_p): If bfd_external_binary_architecture is defined, + set the architecture to this string. + 2001-03-11 Philip Blundell * elf32-arm.h (elf32_arm_finish_dynamic_symbol): Don't make PLT diff --git a/bfd/binary.c b/bfd/binary.c index b80343bed7..a008f90297 100644 --- a/bfd/binary.c +++ b/bfd/binary.c @@ -55,6 +55,10 @@ static boolean binary_set_section_contents PARAMS ((bfd *, asection *, PTR, file_ptr, bfd_size_type)); static int binary_sizeof_headers PARAMS ((bfd *, boolean)); +/* Set by external programs - specifies the BFD architecture + to use when creating binary BFDs. */ +enum bfd_architecture bfd_external_binary_architecture = bfd_arch_unknown; + /* Create a binary object. Invoked via bfd_set_format. */ static boolean @@ -101,6 +105,13 @@ binary_object_p (abfd) abfd->tdata.any = (PTR) sec; + if (bfd_get_arch_info (abfd) != NULL) + { + if ((bfd_get_arch_info (abfd)->arch == bfd_arch_unknown) + && (bfd_external_binary_architecture != bfd_arch_unknown)) + bfd_set_arch_info (abfd, bfd_lookup_arch (bfd_external_binary_architecture, 0)); + } + return abfd->xvec; } diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 124a50d1b2..fc8d5572a1 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,12 @@ +2001-03-12 Stefan Geuken + + * NEWS: Document addition of -B switch to objcopy. + * binutils.texi: Document addition of -B switch to objcopy. + * objcopy.c: (copy_options): Add --binary-architecture. + (copy_usage): Document -B/--binary-architecture. + (copy_main): Support -B/--binary-architecture. Set + bfd_external_binary_architecture. + 2001-03-11 Andreas Jaeger * readelf.c (guess_is_rela): Handle EM_S390_OLD. diff --git a/binutils/NEWS b/binutils/NEWS index 12369e90a7..e14fe5caae 100644 --- a/binutils/NEWS +++ b/binutils/NEWS @@ -1,5 +1,10 @@ -*- text -*- +* New command line switch to objcopy -B (or --binary-architecture) which sets + the archiceture of the output file to the given argument. This option only + makes sense, if the input target is binary. Otherwise it is ignored. + By Stefan Geuken. + * Support for PDP-11 by Lars Brinkhoff. * Add support for ARM v5t and v5te architectures and Intel's XScale ARM diff --git a/binutils/binutils.texi b/binutils/binutils.texi index 648cd2beb3..67260ccf2b 100644 --- a/binutils/binutils.texi +++ b/binutils/binutils.texi @@ -874,6 +874,7 @@ Show a summary of the options to @code{nm} and exit. objcopy [ -F @var{bfdname} | --target=@var{bfdname} ] [ -I @var{bfdname} | --input-target=@var{bfdname} ] [ -O @var{bfdname} | --output-target=@var{bfdname} ] + [ -B @var{bfdarch} | --binary-architecture=@var{bfdarch} ] [ -S | --strip-all ] [ -g | --strip-debug ] [ -K @var{symbolname} | --keep-symbol=@var{symbolname} ] [ -N @var{symbolname} | --strip-symbol=@var{symbolname} ] @@ -960,6 +961,17 @@ Use @var{bfdname} as the object format for both the input and the output file; i.e., simply transfer data from source to destination with no translation. @xref{Target Selection}, for more information. +@item -B @var{bfdarch} +@itemx --binary-architecture=@var{bfdarch} +Useful when transforming a raw binary input file into an object file. +In this case the output architecture can be set to @var{bfdarch}. This +option will be ignored if the input file has a known @var{bfdarch}. You +can access this binary data inside a program by referencing the special +symbols that are created by the conversion process. These symbols are +called _binary_@var{objfile}_start, _binary_@var{objfile}_end and +_binary_@var{objfile}_size. e.g. you can transform a picture file into +an object file and then access it in your code using these symbols. + @item -j @var{sectionname} @itemx --only-section=@var{sectionname} Copy only the named section from the input file to the output file. diff --git a/binutils/objcopy.c b/binutils/objcopy.c index cae66fc87f..abcf6a3aad 100644 --- a/binutils/objcopy.c +++ b/binutils/objcopy.c @@ -252,6 +252,7 @@ static struct option copy_options[] = {"adjust-vma", required_argument, 0, OPTION_CHANGE_ADDRESSES}, {"adjust-section-vma", required_argument, 0, OPTION_CHANGE_SECTION_ADDRESS}, {"adjust-warnings", no_argument, 0, OPTION_CHANGE_WARNINGS}, + {"binary-architecture", required_argument, 0, 'B'}, {"byte", required_argument, 0, 'b'}, {"change-addresses", required_argument, 0, OPTION_CHANGE_ADDRESSES}, {"change-leading-char", no_argument, 0, OPTION_CHANGE_LEADING_CHAR}, @@ -314,6 +315,9 @@ extern unsigned int Chunk; on by the --srec-forceS3 command line switch. */ extern boolean S3Forced; +/* Defined in bfd/binary.c. Used to set architecture of input binary files. */ +extern enum bfd_architecture bfd_external_binary_architecture; + static void copy_usage (stream, exit_status) FILE *stream; @@ -324,6 +328,7 @@ copy_usage (stream, 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\ -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\ @@ -1813,6 +1818,7 @@ copy_main (argc, argv) int argc; char *argv[]; { + char * binary_architecture = NULL; char *input_filename = NULL, *output_filename = NULL; char *input_target = NULL, *output_target = NULL; boolean show_version = false; @@ -1821,7 +1827,7 @@ copy_main (argc, argv) struct section_list *p; struct stat statbuf; - while ((c = getopt_long (argc, argv, "b:i:I:j:K:N:s:O:d:F:L:R:SpgxXVvW:", + while ((c = getopt_long (argc, argv, "b:B:i:I:j:K:N:s:O:d:F:L:R:SpgxXVvW:", copy_options, (int *) 0)) != EOF) { switch (c) @@ -1832,6 +1838,10 @@ copy_main (argc, argv) fatal (_("byte number must be non-negative")); break; + case 'B': + binary_architecture = optarg; + break; + case 'i': interleave = atoi (optarg); if (interleave < 1) @@ -2189,12 +2199,30 @@ copy_main (argc, argv) if (output_target == (char *) NULL) output_target = input_target; - if (preserve_dates) + if (binary_architecture != (char *) NULL) { - if (stat (input_filename, &statbuf) < 0) - fatal (_("Cannot stat: %s: %s"), input_filename, strerror (errno)); + 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; + 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 (_("Cannot stat: %s: %s"), input_filename, strerror (errno)); + /* If there is no destination file then create a temp and rename the result into the input. */