From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-pf1-x444.google.com (mail-pf1-x444.google.com [IPv6:2607:f8b0:4864:20::444]) by sourceware.org (Postfix) with ESMTPS id 63D43385BF86 for ; Sun, 22 Mar 2020 12:29:50 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 63D43385BF86 Received: by mail-pf1-x444.google.com with SMTP id j1so3331051pfe.0 for ; Sun, 22 Mar 2020 05:29:50 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id:mime-version :content-transfer-encoding; bh=yox4V5nXKHpnWf53mfOTufOpTlM7m4893qix+ZWYn8U=; b=foB0jPrL7dRN/coxwFXK0VywBAU0fTHvP930/EAr9LicyJN+OEz892vxp63FYL4KQY m3ELSjf6AYrcccgb7lkl1zBQ2y719QAT6wtpPMCmpaw6X617OZM7BJGJi+2QWCIz6PJc R4tHQgehCxfDFM52wPaoH9F8d9lsD0LQIGOJNug/H+7NhXPywC4APxKnnFQ0tdCHYLco DVqISJkwozQM+y25rYsChxSaL9vRUE2dV34ujI/we6V9nbInP7WLJKEh8Z+84+M8wm29 B16gfeiSZGSif7i/sOI4uRcvK7NGmbEXRYxfAJ1K2nqxMjsVm20SRTudqAIXljOkvkvu QFzQ== X-Gm-Message-State: ANhLgQ2E08GguvsJpXIb/FYMeQaiQET83lllFyRG4OpU7uketmQ9f4nk PYWFc3woDZFEguml4flr7Rs/mdEI X-Google-Smtp-Source: ADFU+vvss67XZj0LA4Zt96vN9BQaKaq0m5b8IEAh3oMk78VjBLS5vnbDe1A+gh2Fb0iFFS1lGdtbjA== X-Received: by 2002:a62:2ad0:: with SMTP id q199mr20249425pfq.48.1584880188983; Sun, 22 Mar 2020 05:29:48 -0700 (PDT) Received: from gnu-cfl-2.localdomain (c-69-181-90-243.hsd1.ca.comcast.net. [69.181.90.243]) by smtp.gmail.com with ESMTPSA id n7sm9568871pgm.28.2020.03.22.05.29.48 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 22 Mar 2020 05:29:48 -0700 (PDT) Received: from gnu-cfl-2.localdomain (localhost [IPv6:::1]) by gnu-cfl-2.localdomain (Postfix) with ESMTP id B3DAAC0377 for ; Sun, 22 Mar 2020 05:29:47 -0700 (PDT) From: "H.J. Lu" To: binutils@sourceware.org Subject: [PATCH] bfd: Display symbol version for nm -D Date: Sun, 22 Mar 2020 05:29:47 -0700 Message-Id: <20200322122947.270417-1-hjl.tools@gmail.com> X-Mailer: git-send-email 2.25.1 MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Spam-Status: No, score=-27.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_STOCKGEN, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: binutils@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Binutils mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 22 Mar 2020 12:29:52 -0000 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/pr25707.d: New file. --- bfd/elf-bfd.h | 2 ++ bfd/elf.c | 27 +++++++++++++++++++++------ binutils/nm.c | 26 ++++++++++++++++++++------ ld/testsuite/ld-elf/pr25707.d | 9 +++++++++ 4 files changed, 52 insertions(+), 12 deletions(-) create mode 100644 ld/testsuite/ld-elf/pr25707.d diff --git a/bfd/elf-bfd.h b/bfd/elf-bfd.h index d4ac5152df..c546b583b8 100644 --- a/bfd/elf-bfd.h +++ b/bfd/elf-bfd.h @@ -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); diff --git a/bfd/elf.c b/bfd/elf.c index 975eeb06b8..1004809e45 100644 --- 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 diff --git a/binutils/nm.c b/binutils/nm.c index 0ee3f88386..0e475f8006 100644 --- a/binutils/nm.c +++ b/binutils/nm.c @@ -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))) diff --git a/ld/testsuite/ld-elf/pr25707.d b/ld/testsuite/ld-elf/pr25707.d new file mode 100644 index 0000000000..e487d227b3 --- /dev/null +++ b/ld/testsuite/ld-elf/pr25707.d @@ -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 -- 2.25.1