From 970ccc773455dbe0a2ab943f110162ed87c580d8 Mon Sep 17 00:00:00 2001 From: Nick Clifton Date: Mon, 2 Apr 2007 16:51:13 +0000 Subject: [PATCH] PR binutils/4292 * bfd.c (bfd_fprintf_vma): Do not print addresses of 32-bit targets as 64-bit values, even if running on a 64-bit host. * coffgen.c (coff_print_symbol): Likewise. * nm.c (value_format): Replace with value_format_32bit and value_format_64bit. (set_radix): Update setting of value_format. (set_print_width): New function. Compute the address size of a given bfd and set the print_width global appropriately. (display_archive): Use set_print_width. (display_file): Likewise, (print_object_filename_sysv): Update use of print_width. (print_archive_member_sysv): Likewise. (print_symbol_filename_posix): Likewise. (print_sumbol_info_bfd, print_symbol_info_sysv): Likewise. --- bfd/ChangeLog | 7 ++++ bfd/bfd.c | 9 ++++ bfd/coffgen.c | 11 ++++- binutils/ChangeLog | 15 +++++++ binutils/nm.c | 118 ++++++++++++++++++++++++++++------------------------- 5 files changed, 104 insertions(+), 56 deletions(-) diff --git a/bfd/ChangeLog b/bfd/ChangeLog index 948b4e3..96f8252 100644 --- a/bfd/ChangeLog +++ b/bfd/ChangeLog @@ -1,3 +1,10 @@ +2007-04-02 Nick Clifton + + PR binutils/4292 + * bfd.c (bfd_fprintf_vma): Do not print addresses of 32-bit + targets as 64-bit values, even if running on a 64-bit host. + * coffgen.c (coff_print_symbol): Likewise. + 2007-03-29 Nick Clifton PR binutils/4110 diff --git a/bfd/bfd.c b/bfd/bfd.c index 79ae8a9..381e3d7 100644 --- a/bfd/bfd.c +++ b/bfd/bfd.c @@ -1388,6 +1388,15 @@ bfd_fprintf_vma (bfd *abfd, void *stream, bfd_vma value) { if (bfd_get_flavour (abfd) == bfd_target_elf_flavour) get_elf_backend_data (abfd)->elf_backend_fprintf_vma (abfd, stream, value); +#ifdef BFD64 + /* fprintf_vma() on a 64-bit enabled host will always print a 64-bit + value, but really we want to display the address in the target's + address size. Since we do not have a field in the bfd structure + to tell us this, we take a guess, based on the target's name. */ + else if (strstr (bfd_get_target (abfd), "64") == NULL + && strcmp (bfd_get_target (abfd), "mmo") != 0) + fprintf ((FILE *) stream, "%08lx", (unsigned long) (value & 0xffffffff)); +#endif else fprintf_vma ((FILE *) stream, value); } diff --git a/bfd/coffgen.c b/bfd/coffgen.c index bef7d7a..c87967d 100644 --- a/bfd/coffgen.c +++ b/bfd/coffgen.c @@ -1901,7 +1901,16 @@ coff_print_symbol (bfd *abfd, combined->u.syment.n_type, combined->u.syment.n_sclass, combined->u.syment.n_numaux); - fprintf_vma (file, val); +#ifdef BFD64 + /* fprintf_vma() on a 64-bit enabled host will always print a 64-bit + value, but really we want to display the address in the target's + address size. Since we do not have a field in the bfd structure + to tell us this, we take a guess, based on the target's name. */ + if (strstr (bfd_get_target (abfd), "64") == NULL) + fprintf (file, "%08lx", (unsigned long) (val & 0xffffffff)); + else +#endif + fprintf_vma (file, val); fprintf (file, " %s", symbol->name); for (aux = 0; aux < combined->u.syment.n_numaux; aux++) diff --git a/binutils/ChangeLog b/binutils/ChangeLog index 74323fb..3d8c761 100644 --- a/binutils/ChangeLog +++ b/binutils/ChangeLog @@ -1,3 +1,18 @@ +2007-04-02 Nick Clifton + + PR binutils/4292 + * nm.c (value_format): Replace with value_format_32bit and + value_format_64bit. + (set_radix): Update setting of value_format. + (set_print_width): New function. Compute the address size of a + given bfd and set the print_width global appropriately. + (display_archive): Use set_print_width. + (display_file): Likewise, + (print_object_filename_sysv): Update use of print_width. + (print_archive_member_sysv): Likewise. + (print_symbol_filename_posix): Likewise. + (print_sumbol_info_bfd, print_symbol_info_sysv): Likewise. + 2007-03-28 Richard Sandiford Phil Edwards diff --git a/binutils/nm.c b/binutils/nm.c index e3ab36f..3b0b7e0 100644 --- a/binutils/nm.c +++ b/binutils/nm.c @@ -159,20 +159,9 @@ static int filename_per_file = 0; /* Once per file, on its own line. */ static int filename_per_symbol = 0; /* Once per symbol, at start of line. */ /* Print formats for printing a symbol value. */ -#ifndef BFD64 -static char value_format[] = "%08lx"; -#else -#if BFD_HOST_64BIT_LONG -static char value_format[] = "%016lx"; -#else -/* We don't use value_format for this case. */ -#endif -#endif -#ifdef BFD64 -static int print_width = 16; -#else -static int print_width = 8; -#endif +static char value_format_32bit[] = "%08lx"; +static char value_format_64bit[] = "%016lx"; +static int print_width = 0; static int print_radix = 16; /* Print formats for printing stab info. */ static char other_format[] = "%02x"; @@ -279,16 +268,8 @@ set_print_radix (char *radix) print_radix = 10; else print_radix = 8; -#ifndef BFD64 - value_format[4] = *radix; -#else -#if BFD_HOST_64BIT_LONG - value_format[5] = *radix; -#else - /* This case requires special handling for octal and decimal - printing. */ -#endif -#endif + value_format_32bit[4] = *radix; + value_format_64bit[5] = *radix; other_format[3] = desc_format[3] = *radix; break; default: @@ -1094,6 +1075,26 @@ display_rel_file (bfd *abfd, bfd *archive_bfd) } static void +set_print_width (bfd *file) +{ + print_width = bfd_get_arch_size (file); + + if (print_width == -1) + { + /* PR binutils/4292 + Guess the target's bitsize based on its name. + We assume here than any 64-bit format will include + "64" somewhere in its name. The only known exception + is the MMO object file format. */ + if (strstr (bfd_get_target (file), "64") != NULL + || strcmp (bfd_get_target (file), "mmo") == 0) + print_width = 64; + else + print_width = 32; + } +} + +static void display_archive (bfd *file) { bfd *arfile = NULL; @@ -1120,10 +1121,7 @@ display_archive (bfd *file) if (bfd_check_format_matches (arfile, bfd_object, &matching)) { - char buf[30]; - - bfd_sprintf_vma (arfile, buf, (bfd_vma) -1); - print_width = strlen (buf); + set_print_width (arfile); format->print_archive_member (bfd_get_filename (file), bfd_get_filename (arfile)); display_rel_file (arfile, file); @@ -1178,10 +1176,7 @@ display_file (char *filename) } else if (bfd_check_format_matches (file, bfd_object, &matching)) { - char buf[30]; - - bfd_sprintf_vma (file, buf, (bfd_vma) -1); - print_width = strlen (buf); + set_print_width (file); format->print_object_filename (filename); display_rel_file (file, NULL); } @@ -1227,7 +1222,7 @@ print_object_filename_sysv (char *filename) printf (_("\n\nUndefined symbols from %s:\n\n"), filename); else printf (_("\n\nSymbols from %s:\n\n"), filename); - if (print_width == 8) + if (print_width == 32) printf (_("\ Name Value Class Type Size Line Section\n\n")); else @@ -1278,7 +1273,7 @@ print_archive_member_sysv (char *archive, const char *filename) printf (_("\n\nUndefined symbols from %s[%s]:\n\n"), archive, filename); else printf (_("\n\nSymbols from %s[%s]:\n\n"), archive, filename); - if (print_width == 8) + if (print_width == 32) printf (_("\ Name Value Class Type Size Line Section\n\n")); else @@ -1336,29 +1331,42 @@ print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd) static void print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val) { -#if ! defined (BFD64) || BFD_HOST_64BIT_LONG - printf (value_format, val); -#else - /* We have a 64 bit value to print, but the host is only 32 bit. */ - if (print_radix == 16) - bfd_fprintf_vma (abfd, stdout, val); - else + switch (print_width) { - char buf[30]; - char *s; + case 32: + printf (value_format_32bit, val); + break; - s = buf + sizeof buf; - *--s = '\0'; - while (val > 0) + case 64: +#if BFD_HOST_64BIT_LONG + printf (value_format_64bit, val); +#else + /* We have a 64 bit value to print, but the host is only 32 bit. */ + if (print_radix == 16) + bfd_fprintf_vma (abfd, stdout, val); + else { - *--s = (val % print_radix) + '0'; - val /= print_radix; + char buf[30]; + char *s; + + s = buf + sizeof buf; + *--s = '\0'; + while (val > 0) + { + *--s = (val % print_radix) + '0'; + val /= print_radix; + } + while ((buf + sizeof buf - 1) - s < 16) + *--s = '0'; + printf ("%s", s); } - while ((buf + sizeof buf - 1) - s < 16) - *--s = '0'; - printf ("%s", s); - } #endif + break; + + default: + fatal (_("Print width has not been initialized (%d)"), print_width); + break; + } } /* Print a line of information about a symbol. */ @@ -1368,7 +1376,7 @@ print_symbol_info_bsd (struct extended_symbol_info *info, bfd *abfd) { if (bfd_is_undefined_symclass (SYM_TYPE (info))) { - if (print_width == 16) + if (print_width == 64) printf (" "); printf (" "); } @@ -1411,7 +1419,7 @@ print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd) if (bfd_is_undefined_symclass (SYM_TYPE (info))) { - if (print_width == 8) + if (print_width == 32) printf (" "); else printf (" "); @@ -1441,7 +1449,7 @@ print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd) print_value (abfd, SYM_SIZE (info)); else { - if (print_width == 8) + if (print_width == 32) printf (" "); else printf (" "); -- 2.7.4