This is the mail archive of the
binutils@sourceware.org
mailing list for the binutils project.
[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;