PR binutils/4292
authorNick Clifton <nickc@redhat.com>
Mon, 2 Apr 2007 16:51:13 +0000 (16:51 +0000)
committerNick Clifton <nickc@redhat.com>
Mon, 2 Apr 2007 16:51:13 +0000 (16:51 +0000)
* 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
bfd/bfd.c
bfd/coffgen.c
binutils/ChangeLog
binutils/nm.c

index 948b4e3a199af1aada4dc2c5d7e50104f961d2c0..96f825255b1379dd657102265f23e77af3722064 100644 (file)
@@ -1,3 +1,10 @@
+2007-04-02  Nick Clifton  <nickc@redhat.com>
+
+       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  <nickc@redhat.com>
 
        PR binutils/4110
index 79ae8a98a7c37719b6878f5d4243a3776306c521..381e3d7a6de984fad939a5c557626f4353448dbb 100644 (file)
--- 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);
 }
index bef7d7a384cdbcf256111a7ca948ea529a4577ed..c87967d55c7d1029a35124e269710df606251634 100644 (file)
@@ -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++)
index 74323fbec6d841b7e1567dd8000e57e66b76f9c9..3d8c7615c3941eb014a6b7ff3ebffc1febaa5d6e 100644 (file)
@@ -1,3 +1,18 @@
+2007-04-02  Nick Clifton  <nickc@redhat.com>
+
+       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  <richard@codesourcery.com>
            Phil Edwards  <phil@codesourcery.com>
 
index e3ab36f04d7dafcd632ad4113c04772bd2a80b70..3b0b7e0d47e454bcba6a5f5ea9a7d0d56006bdb3 100644 (file)
@@ -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:
@@ -1093,6 +1074,26 @@ display_rel_file (bfd *abfd, bfd *archive_bfd)
   free (minisyms);
 }
 
+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)
 {
@@ -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 ("                ");