This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH objcopy] remove `-B' `binary' requirement


Hi Alan,

On Tue, Sep 01, 2009 at 10:45:21PM +0930, Alan Modra wrote:
> a) get rid of bfd_external_binary_architecture, bfd_external_machine,
>    and the code using them in binary_object_p.
> b) In objcopy.c:copy_main, if -B is given, always run bfd_scan_arch on
>    the -B arg and save the result to, say, binary_arch
> c) pass binary_arch to copy_file, and from there down to copy_object,
>    also via copy_archive.
> d) in copy_object, call bfd_get_arch_info (ibfd) and if bfd_arch_unknown
>    call bfd_set_arch_info, ie. as was done in binary.c

Here is a patch making objcopy -B/--binary-architecure available for any
input file format without archicture info, e.g. `srec'.

Philippe

Index: binutils/ChangeLog
===================================================================
RCS file: /cvs/src/src/binutils/ChangeLog,v
retrieving revision 1.1528
diff -u -p -r1.1528 ChangeLog
--- binutils/ChangeLog	8 Sep 2009 10:34:27 -0000	1.1528
+++ binutils/ChangeLog	9 Sep 2009 23:24:33 -0000
@@ -1,3 +1,18 @@
+2009-09-09  Philippe De Muyter  <phdm@macqel.be>
+
+	* obcopy.c (copy_object): New parameter `input_arch', architecture
+	of input file, if not specified in input file itself; all callers
+	updated; `binary_architecture' hack removed.
+	(copy_archive, copy_file): New parameter `input_arch', for
+	`copy_object' usage.
+	(copy_main): Accept `-B' (`--binary-architecture') option also
+	for any arch-less input ifile format, not only `binary'; remove
+	bfd_external_binary_architecture hack; instead, add `input_arch'
+	to calls to `copy_file'.
+	* windres.c, windmc.c : Obsolete and useless external references
+	to `bfd_external_binary_architecture' or `bfd_external_machine'
+	removed.
+	
 2009-09-08  Alan Modra  <amodra@bigpond.net.au>
 
 	* dwarf.c (byte_get_little_endian): Handle size of 3.
Index: bfd/ChangeLog
===================================================================
RCS file: /cvs/src/src/bfd/ChangeLog,v
retrieving revision 1.4770
diff -u -p -r1.4770 ChangeLog
--- bfd/ChangeLog	9 Sep 2009 04:49:09 -0000	1.4770
+++ bfd/ChangeLog	9 Sep 2009 23:24:26 -0000
@@ -1,3 +1,9 @@
+2009-09-09  Philippe De Muyter  <phdm@macqel.be>
+
+	* binary.c (binary_object_p): Remove bfd_external_binary_architecture
+	hack.  objcopy `-B' (`--binary-architecture') option is now handled
+	in a generic way.
+
 2009-09-09  M R Swami Reddy <MR.Swami.Reddy@nsc.com>
 
 	* elf32-cr16.c (elf32_cr16_relocate_section): Add code to discard the
Index: bfd/binary.c
===================================================================
RCS file: /cvs/src/src/bfd/binary.c,v
retrieving revision 1.36
diff -u -p -r1.36 binary.c
--- bfd/binary.c	2 Sep 2009 07:18:35 -0000	1.36
+++ bfd/binary.c	9 Sep 2009 23:24:28 -0000
@@ -42,11 +42,6 @@
    a start symbol, an end symbol, and an absolute length symbol.  */
 #define BIN_SYMS 3
 
-/* Set by external programs - specifies the BFD architecture and
-   machine number to be uses when creating binary BFDs.  */
-enum bfd_architecture  bfd_external_binary_architecture = bfd_arch_unknown;
-unsigned long          bfd_external_machine = 0;
-
 /* Create a binary object.  Invoked via bfd_set_format.  */
 
 static bfd_boolean
@@ -92,14 +87,6 @@ binary_object_p (bfd *abfd)
 
   abfd->tdata.any = (void *) 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, bfd_external_machine));
-    }
-
   return abfd->xvec;
 }
 
===================================================================
RCS file: /cvs/src/src/binutils/objcopy.c,v
retrieving revision 1.134
diff -u -p -r1.134 objcopy.c
--- binutils/objcopy.c	3 Aug 2009 13:47:35 -0000	1.134
+++ binutils/objcopy.c	9 Sep 2009 23:24:36 -0000
@@ -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_statu
   fprintf (stream, _("\
   -I --input-target <bfdname>      Assume input file is in format <bfdname>\n\
   -O --output-target <bfdname>     Create an output file in format <bfdname>\n\
-  -B --binary-architecture <arch>  Set arch of output file, when input is binary\n\
+  -B --binary-architecture <arch>  Set output arch, when input is arch-less\n\
   -F --target <bfdname>            Set both input and output format to <bfdname>\n\
      --debugging                   Convert debugging information, if possible\n\
   -p --preserve-dates              Copy modified/access timestamps to the output\n\
@@ -1400,7 +1395,7 @@ copy_unknown_object (bfd *ibfd, bfd *obf
    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 +1460,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)))
@@ -1955,7 +1962,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
     {
@@ -2049,7 +2057,7 @@ copy_archive (bfd *ibfd, bfd *obfd, cons
 	      return;
 	    }
 
-	  delete = ! copy_object (this_element, output_bfd);
+	  delete = ! copy_object (this_element, output_bfd, input_arch);
 
 	  if (! delete
 	      || bfd_get_arch (this_element) != bfd_arch_unknown)
@@ -2154,7 +2162,8 @@ set_long_section_mode (bfd *output_bfd, 
 
 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 +2214,7 @@ copy_file (const char *input_filename, c
       /* 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 +2236,7 @@ copy_file (const char *input_filename, c
       /* 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))
@@ -3008,7 +3017,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 +3152,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 +3163,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 +3177,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':
@@ -3823,29 +3834,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 +3850,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)
Index: binutils/windmc.c
===================================================================
RCS file: /cvs/src/src/binutils/windmc.c,v
retrieving revision 1.7
diff -u -p -r1.7 windmc.c
--- binutils/windmc.c	25 Nov 2008 08:48:49 -0000	1.7
+++ binutils/windmc.c	9 Sep 2009 23:24:36 -0000
@@ -51,11 +51,6 @@ typedef struct mc_msg_item
   struct bin_messagetable_item *res;
 } mc_msg_item;
 
-/* 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;
-
 int target_is_bigendian = 0;
 const char *def_target_arch;
 
Index: binutils/windres.c
===================================================================
RCS file: /cvs/src/src/binutils/windres.c,v
retrieving revision 1.39
diff -u -p -r1.39 windres.c
--- binutils/windres.c	2 Sep 2009 07:22:32 -0000	1.39
+++ binutils/windres.c	9 Sep 2009 23:24:37 -0000
@@ -46,11 +46,6 @@
 #include "obstack.h"
 #include "windres.h"
 
-/* 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;
-
 /* Used by resrc.c at least.  */
 
 int verbose = 0;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]