X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=binutils%2Fbucomm.c;h=9e6a02843e6c7ba11545f69a6a31e927d177a9b0;hb=441af85bd9c68dbc0c2a1dbe23bf07c6cb3c3f5d;hp=e719cd3a2e344c87c1e41e8f25723565f0c4b129;hpb=76e7a75123dc36dbc4ddce8a23d2acb171c2bce2;p=deliverable%2Fbinutils-gdb.git diff --git a/binutils/bucomm.c b/binutils/bucomm.c index e719cd3a2e..9e6a02843e 100644 --- a/binutils/bucomm.c +++ b/binutils/bucomm.c @@ -1,5 +1,5 @@ /* bucomm.c -- Bin Utils COMmon code. - Copyright (C) 1991-2016 Free Software Foundation, Inc. + Copyright (C) 1991-2020 Free Software Foundation, Inc. This file is part of GNU Binutils. @@ -25,7 +25,6 @@ #include "bfd.h" #include "libiberty.h" #include "filenames.h" -#include "libbfd.h" #include /* ctime, maybe time_t */ #include @@ -36,11 +35,6 @@ typedef long time_t; #endif #endif - -static const char * endian_string (enum bfd_endian); -static int display_target_list (void); -static int display_info_table (int, int); -static int display_target_tables (void); /* Error reporting. */ @@ -50,8 +44,12 @@ void bfd_nonfatal (const char *string) { const char *errmsg; + enum bfd_error err = bfd_get_error (); - errmsg = bfd_errmsg (bfd_get_error ()); + if (err == bfd_error_no_error) + errmsg = _("cause of error unknown"); + else + errmsg = bfd_errmsg (err); fflush (stdout); if (string) fprintf (stderr, "%s: %s: %s\n", program_name, string, errmsg); @@ -66,10 +64,10 @@ bfd_nonfatal (const char *string) bfd error message is printed. In summary, error messages are of one of the following forms: - PROGRAM:file: bfd-error-message - PROGRAM:file[section]: bfd-error-message - PROGRAM:file: printf-message: bfd-error-message - PROGRAM:file[section]: printf-message: bfd-error-message. */ + PROGRAM: file: bfd-error-message + PROGRAM: file[section]: bfd-error-message + PROGRAM: file: printf-message: bfd-error-message + PROGRAM: file[section]: printf-message: bfd-error-message. */ void bfd_nonfatal_message (const char *filename, @@ -80,8 +78,12 @@ bfd_nonfatal_message (const char *filename, const char *errmsg; const char *section_name; va_list args; + enum bfd_error err = bfd_get_error (); - errmsg = bfd_errmsg (bfd_get_error ()); + if (err == bfd_error_no_error) + errmsg = _("cause of error unknown"); + else + errmsg = bfd_errmsg (err); fflush (stdout); section_name = NULL; va_start (args, format); @@ -92,12 +94,12 @@ bfd_nonfatal_message (const char *filename, if (!filename) filename = bfd_get_archive_filename (abfd); if (section) - section_name = bfd_get_section_name (abfd, section); + section_name = bfd_section_name (section); } if (section_name) - fprintf (stderr, ":%s[%s]", filename, section_name); + fprintf (stderr, ": %s[%s]", filename, section_name); else - fprintf (stderr, ":%s", filename); + fprintf (stderr, ": %s", filename); if (format) { @@ -216,9 +218,6 @@ list_supported_architectures (const char *name, FILE *f) free (arches); } -/* The length of the longest architecture name + 1. */ -#define LONGEST_ARCH sizeof ("powerpc:common") - static const char * endian_string (enum bfd_endian endian) { @@ -230,184 +229,205 @@ endian_string (enum bfd_endian endian) } } +/* Data passed to do_display_target and other target iterators. */ + +struct display_target { + /* Temp file. */ + char *filename; + /* Return status. */ + int error; + /* Number of targets. */ + int count; + /* Size of info in bytes. */ + size_t alloc; + /* Per-target info. */ + struct { + /* Target name. */ + const char *name; + /* Non-zero if target/arch combination supported. */ + unsigned char arch[bfd_arch_last - bfd_arch_obscure - 1]; + } *info; +}; + /* List the targets that BFD is configured to support, each followed - by its endianness and the architectures it supports. */ + by its endianness and the architectures it supports. Also build + info about target/archs. */ static int -display_target_list (void) +do_display_target (const bfd_target *targ, void *data) { - char *dummy_name; - int t; - int ret = 1; + struct display_target *param = (struct display_target *) data; + bfd *abfd; + size_t amt; - dummy_name = make_temp_file (NULL); - for (t = 0; bfd_target_vector[t]; t++) + param->count += 1; + amt = param->count * sizeof (*param->info); + if (param->alloc < amt) { - 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)); + size_t size = ((param->count < 64 ? 64 : param->count) + * sizeof (*param->info) * 2); + param->info = xrealloc (param->info, size); + memset ((char *) param->info + param->alloc, 0, size - param->alloc); + param->alloc = size; + } + param->info[param->count - 1].name = targ->name; - if (abfd == NULL) - { - bfd_nonfatal (dummy_name); - ret = 0; - continue; - } + printf (_("%s\n (header %s, data %s)\n"), targ->name, + endian_string (targ->header_byteorder), + endian_string (targ->byteorder)); - if (! bfd_set_format (abfd, bfd_object)) + abfd = bfd_openw (param->filename, targ->name); + if (abfd == NULL) + { + bfd_nonfatal (param->filename); + param->error = 1; + } + else if (!bfd_set_format (abfd, bfd_object)) + { + if (bfd_get_error () != bfd_error_invalid_operation) { - if (bfd_get_error () != bfd_error_invalid_operation) - { - bfd_nonfatal (p->name); - ret = 0; - } - bfd_close_all_done (abfd); - continue; + bfd_nonfatal (targ->name); + param->error = 1; } + } + else + { + enum bfd_architecture a; for (a = bfd_arch_obscure + 1; a < 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); + if (bfd_set_arch_mach (abfd, a, 0)) + { + printf (" %s\n", bfd_printable_arch_mach (a, 0)); + param->info[param->count - 1].arch[a - bfd_arch_obscure - 1] = 1; + } } - unlink (dummy_name); - free (dummy_name); + if (abfd != NULL) + bfd_close_all_done (abfd); - return ret; + return param->error; +} + +static void +display_target_list (struct display_target *arg) +{ + arg->filename = make_temp_file (NULL); + arg->error = 0; + arg->count = 0; + arg->alloc = 0; + arg->info = NULL; + + bfd_iterate_over_targets (do_display_target, arg); + + unlink (arg->filename); + free (arg->filename); } -/* Print a table showing which architectures are supported for entries - FIRST through LAST-1 of bfd_target_vector (targets across, - architectures down). */ +/* Calculate how many targets we can print across the page. */ static int -display_info_table (int first, int last) +do_info_size (int targ, int width, const struct display_target *arg) { - int t; - int ret = 1; - char *dummy_name; - int a; - - /* 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 = bfd_arch_obscure + 1; a < bfd_arch_last; a++) - if (strcmp (bfd_printable_arch_mach ((enum bfd_architecture) a, 0), - "UNKNOWN!") != 0) - { - printf ("%*s ", (int) LONGEST_ARCH - 1, - bfd_printable_arch_mach ((enum bfd_architecture) 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, (enum bfd_architecture) 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); + while (targ < arg->count) + { + width -= strlen (arg->info[targ].name) + 1; + if (width < 0) + return targ; + ++targ; + } + return targ; +} - return ret; +/* Print header of target names. */ + +static void +do_info_header (int targ, int stop_targ, const struct display_target *arg) +{ + while (targ != stop_targ) + printf ("%s ", arg->info[targ++].name); +} + +/* Print a table row. */ + +static void +do_info_row (int targ, int stop_targ, enum bfd_architecture a, + const struct display_target *arg) +{ + while (targ != stop_targ) + { + if (arg->info[targ].arch[a - bfd_arch_obscure - 1]) + fputs (arg->info[targ].name, stdout); + else + { + int l = strlen (arg->info[targ].name); + while (l--) + putchar ('-'); + } + ++targ; + if (targ != stop_targ) + putchar (' '); + } } /* Print tables of all the target-architecture combinations that BFD has been configured to support. */ -static int -display_target_tables (void) +static void +display_target_tables (const struct display_target *arg) { - int t; - int columns; - int ret = 1; - 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) + const char *columns; + int width, start_targ, stop_targ; + enum bfd_architecture arch; + int longest_arch = 0; + + for (arch = bfd_arch_obscure + 1; arch < bfd_arch_last; arch++) { - int oldt = t, wid; + const char *s = bfd_printable_arch_mach (arch, 0); + int len = strlen (s); + if (len > longest_arch) + longest_arch = len; + } - wid = LONGEST_ARCH + strlen (bfd_target_vector[t]->name) + 1; - ++t; - while (wid < columns && bfd_target_vector[t] != NULL) - { - int newwid; + width = 0; + columns = getenv ("COLUMNS"); + if (columns != NULL) + width = atoi (columns); + if (width == 0) + width = 80; - newwid = wid + strlen (bfd_target_vector[t]->name) + 1; - if (newwid >= columns) - break; - wid = newwid; - ++t; + for (start_targ = 0; start_targ < arg->count; start_targ = stop_targ) + { + stop_targ = do_info_size (start_targ, width - longest_arch - 1, arg); + + printf ("\n%*s", longest_arch + 1, " "); + do_info_header (start_targ, stop_targ, arg); + putchar ('\n'); + + for (arch = bfd_arch_obscure + 1; arch < bfd_arch_last; arch++) + { + if (strcmp (bfd_printable_arch_mach (arch, 0), "UNKNOWN!") != 0) + { + printf ("%*s ", longest_arch, + bfd_printable_arch_mach (arch, 0)); + + do_info_row (start_targ, stop_targ, arch, arg); + putchar ('\n'); + } } - if (! display_info_table (oldt, t)) - ret = 0; } - - return ret; } int display_info (void) { + struct display_target arg; + printf (_("BFD header file version %s\n"), BFD_VERSION_STRING); - if (! display_target_list () || ! display_target_tables ()) - return 1; - else - return 0; + + display_target_list (&arg); + if (!arg.error) + display_target_tables (&arg); + + return arg.error; } /* Display the archive header for an element as if it were an ls -l listing: @@ -415,7 +435,7 @@ display_info (void) Mode User\tGroup\tSize\tDate Name */ void -print_arelt_descr (FILE *file, bfd *abfd, bfd_boolean verbose) +print_arelt_descr (FILE *file, bfd *abfd, bfd_boolean verbose, bfd_boolean offsets) { struct stat buf; @@ -446,7 +466,17 @@ print_arelt_descr (FILE *file, bfd *abfd, bfd_boolean verbose) } } - fprintf (file, "%s\n", bfd_get_filename (abfd)); + fprintf (file, "%s", bfd_get_filename (abfd)); + + if (offsets) + { + if (bfd_is_thin_archive (abfd) && abfd->proxy_origin) + fprintf (file, " 0x%lx", (unsigned long) abfd->proxy_origin); + else if (!bfd_is_thin_archive (abfd) && abfd->origin) + fprintf (file, " 0x%lx", (unsigned long) abfd->origin); + } + + fprintf (file, "\n"); } /* Return a path for a new temporary file in the same directory @@ -502,7 +532,7 @@ template_in_dir (const char *path) as FILENAME. */ char * -make_tempname (char *filename) +make_tempname (const char *filename) { char *tmpname = template_in_dir (filename); int fd; @@ -528,7 +558,7 @@ make_tempname (char *filename) directory containing FILENAME. */ char * -make_tempdir (char *filename) +make_tempdir (const char *filename) { char *tmpname = template_in_dir (filename); @@ -575,6 +605,9 @@ get_file_size (const char * file_name) { struct stat statbuf; + if (file_name == NULL) + return (off_t) -1; + if (stat (file_name, &statbuf) < 0) { if (errno == ENOENT) @@ -583,6 +616,8 @@ get_file_size (const char * file_name) non_fatal (_("Warning: could not locate '%s'. reason: %s"), file_name, strerror (errno)); } + else if (S_ISDIR (statbuf.st_mode)) + non_fatal (_("Warning: '%s' is a directory"), file_name); else if (! S_ISREG (statbuf.st_mode)) non_fatal (_("Warning: '%s' is not an ordinary file"), file_name); else if (statbuf.st_size < 0)