bfd: Display symbol version for nm -D
authorH.J. Lu <hjl.tools@gmail.com>
Tue, 24 Mar 2020 11:23:11 +0000 (04:23 -0700)
committerH.J. Lu <hjl.tools@gmail.com>
Tue, 24 Mar 2020 11:23:11 +0000 (04:23 -0700)
Extend _bfd_elf_get_symbol_version_string for nm -D to display symbol
version.  _bfd_elf_get_symbol_version_name is added to avoid updating
all XXX_get_symbol_version_string functions.

bfd/

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.

binutils/

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.

ld/

PR binutils/25708
* testsuite/ld-elf/pr25708.d: New file.

bfd/ChangeLog
bfd/elf-bfd.h
bfd/elf.c
binutils/ChangeLog
binutils/nm.c
ld/ChangeLog
ld/testsuite/ld-elf/pr25708.d [new file with mode: 0644]

index da8e05894f07729454a083374043a3edd8bce452..7cc34c1bb9b13a481ced670300eddf854dfa9474 100644 (file)
@@ -1,3 +1,11 @@
+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
index d4ac5152dfe9a13e50eac3aca82157db57f25ec0..c546b583b87cf6a3639afa4566969b26268bdd9e 100644 (file)
@@ -2078,6 +2078,8 @@ extern bfd_boolean _bfd_elf_print_private_bfd_data
   (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);
 
index 975eeb06b8058ef754a74e33f9c795e6e0b2d1be..1004809e454f179a94382d4ca17a656f497d55da 100644 (file)
--- a/bfd/elf.c
+++ b/bfd/elf.c
@@ -1883,11 +1883,13 @@ _bfd_elf_print_private_bfd_data (bfd *abfd, void *farg)
   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
@@ -1904,10 +1906,14 @@ _bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol,
               && (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;
@@ -1933,6 +1939,15 @@ _bfd_elf_get_symbol_version_string (bfd *abfd, asymbol *symbol,
   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
index 11be80dfc3067ba9b9f48aa7b8b0dcb259b6a159..2565f36db26cdcc89a7078628819a13eb4bdee85 100644 (file)
@@ -1,3 +1,15 @@
+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.
index 0ee3f8838654adb39054f1ad64cc4eab2b4cc288..0e475f8006345a1b5ddf54680ef726c3c26e6d17 100644 (file)
@@ -67,7 +67,6 @@ struct extended_symbol_info
   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)
@@ -394,8 +393,11 @@ get_coff_symbol_type (const struct internal_syment *sym)
    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);
@@ -409,6 +411,18 @@ print_symname (const char *form, const char *name, bfd *abfd)
     }
 
   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
@@ -433,7 +447,7 @@ print_symdef_entry (bfd *abfd)
        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));
        }
     }
@@ -1606,13 +1620,13 @@ print_symbol_info_bsd (struct extended_symbol_info *info, bfd *abfd)
       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)))
     {
@@ -1667,7 +1681,7 @@ print_symbol_info_sysv (struct extended_symbol_info *info, bfd *abfd)
 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)))
index 12efa1117fe3b95d023390d37622af5994496900..ac7dca4625a88a6ea2741fc29f06cf7ddd5732b0 100644 (file)
@@ -1,3 +1,8 @@
+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.
diff --git a/ld/testsuite/ld-elf/pr25708.d b/ld/testsuite/ld-elf/pr25708.d
new file mode 100644 (file)
index 0000000..e487d22
--- /dev/null
@@ -0,0 +1,9 @@
+#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