This is the mail archive of the
binutils@sources.redhat.com
mailing list for the binutils project.
Re: [RFC] objcopy/objdump targets list
On Mon, Mar 17, 2003 at 11:30:33AM +0000, Nick Clifton wrote:
> Hi Elias,
>
> > objdump has a very nice and handy -i option to list all the
> > supported targets. I propose to move this code
> > (display_targets_table, etc) in bucomm.c and make objcopy use it,
> > too.
>
> This would be OK. It might also be an idea to tidy up the formatting
Here is a patch that moves all the needed stuff from objdump.c to bucomm.c.
If it is approved I'm going to change objcopy to use the 'new' functions.
Regards,
Elias
ChangeLog
2003-03-24 Elias Athanasopoulos <elathan at phys dot uoa dot gr>
* objdump.c (endian_string): Move to bucomm.c.
(display_info): Likewise.
(display_target_list): Likewise.
(display_info_table): Likewise.
(display_target_tables): Likewise.
(main): Assign the return value of display_info to exit_status.
* bucomm.c: Include bfdver.h
(display_target_list): Call bfd_nonfatal instead of nonfatal and
return 0 on a non-fatal errror, 1 on success.
(display_info_table): Likewise.
* bucomm.h (endian_string): Define. Make it non-static.
(display_info): Define. Change prototype so as to return int,
instead of static void.
(display_target_list): Likewise.
(display_info_table): Likewise.
(display_target_tables): Likewise.
===================================================================
RCS file: /home/anteater/bucvs/src/binutils/objdump.c,v
retrieving revision 1.2
diff -u -r1.2 /home/anteater/bucvs/src/binutils/objdump.c
--- /home/anteater/bucvs/src/binutils/objdump.c 2003/03/20 16:20:39 1.2
+++ /home/anteater/bucvs/src/binutils/objdump.c 2003/03/24 07:54:15
@@ -146,14 +146,6 @@
PARAMS ((bfd *));
static void display_bfd
PARAMS ((bfd *abfd));
-static void display_target_list
- PARAMS ((void));
-static void display_info_table
- PARAMS ((int, int));
-static void display_target_tables
- PARAMS ((void));
-static void display_info
- PARAMS ((void));
static void objdump_print_value
PARAMS ((bfd_vma, struct disassemble_info *, bfd_boolean));
static void objdump_print_symname
@@ -176,8 +168,6 @@
bfd_byte *, bfd_vma, bfd_vma, arelent ***, arelent **));
static void disassemble_data
PARAMS ((bfd *));
-static const char *endian_string
- PARAMS ((enum bfd_endian));
static asymbol ** slurp_symtab
PARAMS ((bfd *));
static asymbol ** slurp_dynamic_symtab
@@ -2570,183 +2560,6 @@
printf ("\n");
}
}
-
-/* The length of the longest architecture name + 1. */
-#define LONGEST_ARCH sizeof("powerpc:common")
-
-static const char *
-endian_string (endian)
- enum bfd_endian endian;
-{
- if (endian == BFD_ENDIAN_BIG)
- return "big endian";
- else if (endian == BFD_ENDIAN_LITTLE)
- return "little endian";
- else
- return "endianness unknown";
-}
-
-/* List the targets that BFD is configured to support, each followed
- by its endianness and the architectures it supports. */
-
-static void
-display_target_list ()
-{
- extern const bfd_target *const *bfd_target_vector;
- char *dummy_name;
- int t;
-
- dummy_name = make_temp_file (NULL);
- for (t = 0; bfd_target_vector[t]; t++)
- {
- const bfd_target *p = bfd_target_vector[t];
- bfd *abfd = bfd_openw (dummy_name, p->name);
- int a;
-
- printf ("%s\n (header %s, data %s)\n", p->name,
- endian_string (p->header_byteorder),
- endian_string (p->byteorder));
-
- if (abfd == NULL)
- {
- nonfatal (dummy_name);
- continue;
- }
-
- if (! bfd_set_format (abfd, bfd_object))
- {
- if (bfd_get_error () != bfd_error_invalid_operation)
- nonfatal (p->name);
- bfd_close_all_done (abfd);
- continue;
- }
-
- for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
- if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
- printf (" %s\n",
- bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
- bfd_close_all_done (abfd);
- }
- unlink (dummy_name);
- free (dummy_name);
-}
-
-/* Print a table showing which architectures are supported for entries
- FIRST through LAST-1 of bfd_target_vector (targets across,
- architectures down). */
-
-static void
-display_info_table (first, last)
- int first;
- int last;
-{
- extern const bfd_target *const *bfd_target_vector;
- int t, a;
- char *dummy_name;
-
- /* Print heading of target names. */
- printf ("\n%*s", (int) LONGEST_ARCH, " ");
- for (t = first; t < last && bfd_target_vector[t]; t++)
- printf ("%s ", bfd_target_vector[t]->name);
- putchar ('\n');
-
- dummy_name = make_temp_file (NULL);
- for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
- if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
- {
- printf ("%*s ", (int) LONGEST_ARCH - 1,
- bfd_printable_arch_mach (a, 0));
- for (t = first; t < last && bfd_target_vector[t]; t++)
- {
- const bfd_target *p = bfd_target_vector[t];
- bfd_boolean ok = TRUE;
- bfd *abfd = bfd_openw (dummy_name, p->name);
-
- if (abfd == NULL)
- {
- nonfatal (p->name);
- ok = FALSE;
- }
-
- if (ok)
- {
- if (! bfd_set_format (abfd, bfd_object))
- {
- if (bfd_get_error () != bfd_error_invalid_operation)
- nonfatal (p->name);
- ok = FALSE;
- }
- }
-
- if (ok)
- {
- if (! bfd_set_arch_mach (abfd, a, 0))
- ok = FALSE;
- }
-
- if (ok)
- printf ("%s ", p->name);
- else
- {
- int l = strlen (p->name);
- while (l--)
- putchar ('-');
- putchar (' ');
- }
- if (abfd != NULL)
- bfd_close_all_done (abfd);
- }
- putchar ('\n');
- }
- unlink (dummy_name);
- free (dummy_name);
-}
-
-/* Print tables of all the target-architecture combinations that
- BFD has been configured to support. */
-
-static void
-display_target_tables ()
-{
- int t, columns;
- extern const bfd_target *const *bfd_target_vector;
- char *colum;
-
- columns = 0;
- colum = getenv ("COLUMNS");
- if (colum != NULL)
- columns = atoi (colum);
- if (columns == 0)
- columns = 80;
-
- t = 0;
- while (bfd_target_vector[t] != NULL)
- {
- int oldt = t, wid;
-
- wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
- ++t;
- while (wid < columns && bfd_target_vector[t] != NULL)
- {
- int newwid;
-
- newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
- if (newwid >= columns)
- break;
- wid = newwid;
- ++t;
- }
- display_info_table (oldt, t);
- }
-}
-
-static void
-display_info ()
-{
- printf (_("BFD header file version %s\n"), BFD_VERSION_STRING);
- display_target_list ();
- display_target_tables ();
-}
int main PARAMS ((int, char **));
@@ -2943,7 +2756,7 @@
usage (stderr, 2);
if (formats_info)
- display_info ();
+ exit_status = display_info ();
else
{
if (optind == argc)
===================================================================
RCS file: /home/anteater/bucvs/src/binutils/bucomm.c,v
retrieving revision 1.2
diff -u -r1.2 /home/anteater/bucvs/src/binutils/bucomm.c
--- /home/anteater/bucvs/src/binutils/bucomm.c 2003/03/20 16:20:44 1.2
+++ /home/anteater/bucvs/src/binutils/bucomm.c 2003/03/24 07:52:19
@@ -1,5 +1,6 @@
/* bucomm.c -- Bin Utils COMmon code.
- Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002
+ Copyright 1991, 1992, 1993, 1994, 1995, 1997, 1998, 2000, 2001, 2002,
+ 2003
Free Software Foundation, Inc.
This file is part of GNU Binutils.
@@ -23,6 +24,7 @@
loaded, but for now it's not necessary. */
#include "bfd.h"
+#include "bfdver.h"
#include "libiberty.h"
#include "bucomm.h"
#include "filenames.h"
@@ -160,7 +162,201 @@
fprintf (f, " %s", *arch);
fprintf (f, "\n");
}
-
+
+/* The length of the longest architecture name + 1. */
+#define LONGEST_ARCH sizeof("powerpc:common")
+
+const char *
+endian_string (endian)
+ enum bfd_endian endian;
+{
+ if (endian == BFD_ENDIAN_BIG)
+ return "big endian";
+ else if (endian == BFD_ENDIAN_LITTLE)
+ return "little endian";
+ else
+ return "endianness unknown";
+}
+
+/* List the targets that BFD is configured to support, each followed
+ by its endianness and the architectures it supports. */
+
+int
+display_target_list ()
+{
+ extern const bfd_target *const *bfd_target_vector;
+ char *dummy_name;
+ int t, ret = 1;
+
+ dummy_name = make_temp_file (NULL);
+ for (t = 0; bfd_target_vector[t]; t++)
+ {
+ const bfd_target *p = bfd_target_vector[t];
+ bfd *abfd = bfd_openw (dummy_name, p->name);
+ int a;
+
+ printf ("%s\n (header %s, data %s)\n", p->name,
+ endian_string (p->header_byteorder),
+ endian_string (p->byteorder));
+
+ if (abfd == NULL)
+ {
+ bfd_nonfatal (dummy_name);
+ ret = 0;
+ continue;
+ }
+
+ if (! bfd_set_format (abfd, bfd_object))
+ {
+ if (bfd_get_error () != bfd_error_invalid_operation)
+ {
+ bfd_nonfatal (p->name);
+ ret = 0;
+ }
+ bfd_close_all_done (abfd);
+ continue;
+ }
+
+ for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
+ if (bfd_set_arch_mach (abfd, (enum bfd_architecture) a, 0))
+ printf (" %s\n",
+ bfd_printable_arch_mach ((enum bfd_architecture) a, 0));
+ bfd_close_all_done (abfd);
+ }
+ unlink (dummy_name);
+ free (dummy_name);
+
+ return ret;
+}
+
+/* Print a table showing which architectures are supported for entries
+ FIRST through LAST-1 of bfd_target_vector (targets across,
+ architectures down). */
+
+int
+display_info_table (first, last)
+ int first;
+ int last;
+{
+ extern const bfd_target *const *bfd_target_vector;
+ int t, a, ret = 1;
+ char *dummy_name;
+
+ /* Print heading of target names. */
+ printf ("\n%*s", (int) LONGEST_ARCH, " ");
+ for (t = first; t < last && bfd_target_vector[t]; t++)
+ printf ("%s ", bfd_target_vector[t]->name);
+ putchar ('\n');
+
+ dummy_name = make_temp_file (NULL);
+ for (a = (int) bfd_arch_obscure + 1; a < (int) bfd_arch_last; a++)
+ if (strcmp (bfd_printable_arch_mach (a, 0), "UNKNOWN!") != 0)
+ {
+ printf ("%*s ", (int) LONGEST_ARCH - 1,
+ bfd_printable_arch_mach (a, 0));
+ for (t = first; t < last && bfd_target_vector[t]; t++)
+ {
+ const bfd_target *p = bfd_target_vector[t];
+ bfd_boolean ok = TRUE;
+ bfd *abfd = bfd_openw (dummy_name, p->name);
+
+ if (abfd == NULL)
+ {
+ bfd_nonfatal (p->name);
+ ret = 0;
+ ok = FALSE;
+ }
+
+ if (ok)
+ {
+ if (! bfd_set_format (abfd, bfd_object))
+ {
+ if (bfd_get_error () != bfd_error_invalid_operation)
+ {
+ bfd_nonfatal (p->name);
+ ret = 0;
+ }
+ ok = FALSE;
+ }
+ }
+
+ if (ok)
+ {
+ if (! bfd_set_arch_mach (abfd, a, 0))
+ ok = FALSE;
+ }
+
+ if (ok)
+ printf ("%s ", p->name);
+ else
+ {
+ int l = strlen (p->name);
+ while (l--)
+ putchar ('-');
+ putchar (' ');
+ }
+ if (abfd != NULL)
+ bfd_close_all_done (abfd);
+ }
+ putchar ('\n');
+ }
+ unlink (dummy_name);
+ free (dummy_name);
+
+ return ret;
+}
+
+/* Print tables of all the target-architecture combinations that
+ BFD has been configured to support. */
+
+int
+display_target_tables ()
+{
+ int t, columns, ret = 1;
+ extern const bfd_target *const *bfd_target_vector;
+ char *colum;
+
+ columns = 0;
+ colum = getenv ("COLUMNS");
+ if (colum != NULL)
+ columns = atoi (colum);
+ if (columns == 0)
+ columns = 80;
+
+ t = 0;
+ while (bfd_target_vector[t] != NULL)
+ {
+ int oldt = t, wid;
+
+ wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1;
+ ++t;
+ while (wid < columns && bfd_target_vector[t] != NULL)
+ {
+ int newwid;
+
+ newwid = wid + strlen (bfd_target_vector[t]->name) + 1;
+ if (newwid >= columns)
+ break;
+ wid = newwid;
+ ++t;
+ }
+ if (! display_info_table (oldt, t))
+ ret = 0;
+ }
+
+ return ret;
+}
+
+int
+display_info ()
+{
+ printf (_("BFD header file version %s\n"), BFD_VERSION_STRING);
+ if (! display_target_list () || ! display_target_tables ())
+ return 1;
+ else
+ return 0;
+}
+
/* Display the archive header for an element as if it were an ls -l listing:
Mode User\tGroup\tSize\tDate Name */
===================================================================
RCS file: /home/anteater/bucvs/src/binutils/bucomm.h,v
retrieving revision 1.1
diff -u -r1.1 /home/anteater/bucvs/src/binutils/bucomm.h
--- /home/anteater/bucvs/src/binutils/bucomm.h 2003/03/20 16:34:06 1.1
+++ /home/anteater/bucvs/src/binutils/bucomm.h 2003/03/24 07:52:34
@@ -1,6 +1,6 @@
/* bucomm.h -- binutils common include file.
Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000,
- 2002 Free Software Foundation, Inc.
+ 2002, 2003 Free Software Foundation, Inc.
This file is part of GNU Binutils.
@@ -175,6 +175,21 @@
void list_supported_architectures
PARAMS ((const char *, FILE *));
+const char * endian_string
+ PARAMS ((enum bfd_endian));
+
+int display_info
+ PARAMS ((void));
+
+int display_target_list
+ PARAMS ((void));
+
+int display_info_table
+ PARAMS ((int, int));
+
+int display_target_tables
+ PARAMS ((void));
+
void print_arelt_descr
PARAMS ((FILE *file, bfd *abfd, bfd_boolean verbose));