+2020-03-24  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/25708
+       * elf-bfd.h (_bfd_elf_get_symbol_version_name): New.
+       * elf.c (_bfd_elf_get_symbol_version_name): New function.  Based
+       on the previous _bfd_elf_get_symbol_version_string.
+       (_bfd_elf_get_symbol_version_string): Use it.
+
 2020-03-24  Alan Modra  <amodra@gmail.com>
 
        * archive.c (_bfd_generic_read_ar_hdr_mag): Sanity check extended
 
   (bfd *, void *);
 const char * _bfd_elf_get_symbol_version_string
   (bfd *, asymbol *, bfd_boolean *);
+const char * _bfd_elf_get_symbol_version_name
+  (bfd *, asymbol *, bfd_boolean, bfd_boolean *);
 extern void bfd_elf_print_symbol
   (bfd *, void *, asymbol *, bfd_print_symbol_type);
 
 
   return FALSE;
 }
 
-/* Get version string.  */
+/* Get version name.  If BASE_P is TRUE, return "Base" for VER_FLG_BASE
+   and return symbol version for symbol version itself.   */
 
 const char *
-_bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol,
-                                   bfd_boolean *hidden)
+_bfd_elf_get_symbol_version_name (bfd *abfd, asymbol *symbol,
+                                 bfd_boolean base_p,
+                                 bfd_boolean *hidden)
 {
   const char *version_string = NULL;
   if (elf_dynversym (abfd) != 0
               && (vernum > elf_tdata (abfd)->cverdefs
                   || (elf_tdata (abfd)->verdef[0].vd_flags
                       == VER_FLG_BASE)))
-       version_string = "Base";
+       version_string = base_p ? "Base" : "";
       else if (vernum <= elf_tdata (abfd)->cverdefs)
-       version_string =
-         elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
+       {
+         const char *nodename
+           = elf_tdata (abfd)->verdef[vernum - 1].vd_nodename;
+         version_string = ((base_p || strcmp (symbol->name, nodename))
+                           ? nodename : "");
+       }
       else
        {
          Elf_Internal_Verneed *t;
   return version_string;
 }
 
+/* Get version string.  */
+
+const char *
+_bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol,
+                                   bfd_boolean *hidden)
+{
+  return _bfd_elf_get_symbol_version_name (abfd, symbol, TRUE, hidden);
+}
+
 /* Display ELF-specific fields of a symbol.  */
 
 void
 
+2020-03-24  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/25708
+       * nm.c (SYM_NAME): Removed.
+       (print_symname): Add a pointer to struct extended_symbol_info
+       argument.  Call _bfd_elf_get_symbol_version_name to get symbol
+       version.
+       (print_symdef_entry): Pass NULL to print_symname.
+       (print_symbol_info_bsd): Update call to print_symname.
+       (print_symbol_info_sysv): Likewise.
+       (print_symbol_info_posix): Likewise.
+
 2020-03-24  Alan Modra  <amodra@gmail.com>
 
        * readelf.c (process_mips_specific): Free iconf on error path.
 
   coff_symbol_type *coffinfo;
   /* FIXME: We should add more fields for Type, Line, Section.  */
 };
-#define SYM_NAME(sym)        (sym->sinfo->name)
 #define SYM_VALUE(sym)       (sym->sinfo->value)
 #define SYM_TYPE(sym)        (sym->sinfo->type)
 #define SYM_STAB_NAME(sym)   (sym->sinfo->stab_name)
    demangling it if requested.  */
 
 static void
-print_symname (const char *form, const char *name, bfd *abfd)
+print_symname (const char *form, struct extended_symbol_info *info,
+              const char *name, bfd *abfd)
 {
+  if (name == NULL)
+    name = info->sinfo->name;
   if (do_demangle && *name)
     {
       char *res = bfd_demangle (abfd, name, demangle_flags);
     }
 
   printf (form, name);
+  if (info != NULL && info->elfinfo)
+    {
+      const char *version_string;
+      bfd_boolean hidden;
+
+      version_string
+       = _bfd_elf_get_symbol_version_name (abfd,
+                                           &info->elfinfo->symbol,
+                                           FALSE, &hidden);
+      if (version_string && version_string[0])
+       printf ("%s%s", hidden ? "@" : "@@", version_string);
+    }
 }
 
 static void
        bfd_fatal ("bfd_get_elt_at_index");
       if (thesym->name != (char *) NULL)
        {
-         print_symname ("%s", thesym->name, abfd);
+         print_symname ("%s", NULL, thesym->name, abfd);
          printf (" in %s\n", bfd_get_filename (elt));
        }
     }
       printf (desc_format, SYM_STAB_DESC (info));
       printf (" %5s", SYM_STAB_NAME (info));
     }
-  print_symname (" %s", SYM_NAME (info), abfd);
+  print_symname (" %s", info, NULL, abfd);
 }
 
 static void
 print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd)
 {
-  print_symname ("%-20s|", SYM_NAME (info), abfd);
+  print_symname ("%-20s|", info, NULL, abfd);
 
   if (bfd_is_undefined_symclass (SYM_TYPE (info)))
     {
 static void
 print_symbol_info_posix (struct extended_symbol_info *info, bfd *abfd)
 {
-  print_symname ("%s ", SYM_NAME (info), abfd);
+  print_symname ("%s ", info, NULL, abfd);
   printf ("%c ", SYM_TYPE (info));
 
   if (bfd_is_undefined_symclass (SYM_TYPE (info)))
 
+2020-03-24  H.J. Lu  <hongjiu.lu@intel.com>
+
+       PR binutils/25708
+       * testsuite/ld-elf/pr25708.d: New file.
+
 2020-03-23  Alan Modra  <amodra@gmail.com>
 
        * Makefile.am (ALL_EMULATION_SOURCES): Reinstate ei386aout.c.
 
--- /dev/null
+#source: pr13195.s
+#ld: -shared -version-script pr13195.t
+#nm: -D
+#target: *-*-linux* *-*-gnu* arm*-*-uclinuxfdpiceabi
+
+#..
+0+ A VERS_2.0
+[0-9a-f]+ T foo@@VERS_2.0
+#pass