mbind gas tests and supports_gnu_osabi testsuite infrastructure
[deliverable/binutils-gdb.git] / binutils / nm.c
index e177d444efde547f4efa0b22a05d0014ca0700fb..0ee3f8838654adb39054f1ad64cc4eab2b4cc288 100644 (file)
@@ -1,5 +1,5 @@
 /* nm.c -- Describe symbol table of a rel file.
-   Copyright (C) 1991-2019 Free Software Foundation, Inc.
+   Copyright (C) 1991-2020 Free Software Foundation, Inc.
 
    This file is part of GNU Binutils.
 
@@ -142,6 +142,7 @@ static struct output_fns formats[] =
 /* The output format to use.  */
 static struct output_fns *format = &formats[FORMAT_DEFAULT];
 static unsigned int print_format = FORMAT_DEFAULT;
+static const char *print_format_string = NULL;
 
 /* Command options.  */
 
@@ -1170,6 +1171,8 @@ display_rel_file (bfd *abfd, bfd *archive_bfd)
          *symp = 0;
          symcount += synth_count;
        }
+      if (!dynamic && dyn_syms != NULL)
+       free (dyn_syms);
     }
 
   /* lto_slim_object is set to false when a bfd is loaded with a compiler
@@ -1216,6 +1219,51 @@ display_rel_file (bfd *abfd, bfd *archive_bfd)
   free (symsizes);
 }
 
+/* Construct a formatting string for printing symbol values.  */
+
+static const char *
+get_print_format (void)
+{
+  const char * padding;
+  if (print_format == FORMAT_POSIX)
+    {
+      /* POSIX compatible output does not have any padding.  */
+      padding = "";
+    }
+  else if (print_width == 32)
+    {
+      padding ="08";
+    }
+  else /* print_width == 64 */
+    {
+      padding = "016";
+    }
+
+  const char * length = "l";
+  if (print_width == 64)
+    {
+#if BFD_HOST_64BIT_LONG
+      ;
+#elif BFD_HOST_64BIT_LONG_LONG
+#ifndef __MSVCRT__
+      length = "ll";
+#else
+      length = "I64";
+#endif
+#endif
+    }
+
+  const char * radix = NULL;
+  switch (print_radix)
+    {
+    case 8:  radix = "o"; break;
+    case 10: radix = "d"; break;
+    case 16: radix = "x"; break;
+    }
+
+  return concat ("%", padding, length, radix, NULL);
+}
+
 static void
 set_print_width (bfd *file)
 {
@@ -1234,6 +1282,8 @@ set_print_width (bfd *file)
       else
        print_width = 32;
     }
+  free ((char *) print_format_string);
+  print_format_string = get_print_format ();
 }
 
 static void
@@ -1474,58 +1524,6 @@ print_symbol_filename_posix (bfd *archive_bfd, bfd *abfd)
     }
 }
 \f
-/* Construct a formatting string for printing symbol values.  */
-
-static const char *
-get_print_format (void)
-{
-  static const char * saved_format = NULL;
-
-  /* See if we have already constructed the format.  */
-  if (saved_format)
-    return saved_format;
-
-  const char * padding;
-  if (print_format == FORMAT_POSIX)
-    {
-      /* POSIX compatible output does not have any padding.  */
-      padding = "";
-    }
-  else if (print_width == 32)
-    {
-      padding ="08";
-    }
-  else /* print_width == 64 */
-    {
-      padding = "016";
-    }
-
-  const char * length = "l";
-  if (print_width == 64)
-    {
-#if BFD_HOST_64BIT_LONG
-      ;
-#elif BFD_HOST_64BIT_LONG_LONG
-#ifndef __MSVCRT__
-      length = "ll";
-#else
-      length = "I64";
-#endif
-#endif
-    }
-
-  const char * radix = NULL;
-  switch (print_radix)
-    {
-    case 8:  radix = "o"; break;
-    case 10: radix = "d"; break;
-    case 16: radix = "x"; break;
-    }
-
-  saved_format = concat ("%", padding, length, radix, NULL);
-  return saved_format;
-}
-
 /* Print a symbol value.  */
 
 static void
@@ -1534,12 +1532,12 @@ print_value (bfd *abfd ATTRIBUTE_UNUSED, bfd_vma val)
   switch (print_width)
     {
     case 32:
-      printf (get_print_format (), (unsigned long) val);
+      printf (print_format_string, (unsigned long) val);
       break;
 
     case 64:
 #if BFD_HOST_64BIT_LONG || BFD_HOST_64BIT_LONG_LONG
-      printf (get_print_format (), val);
+      printf (print_format_string, val);
 #else
       /* We have a 64 bit value to print, but the host is only 32 bit.  */
       if (print_radix == 16)
This page took 0.027855 seconds and 4 git commands to generate.