With CONFIG_LTO_CLANG_THIN, __UNIQUE_ID_* can be global. Therefore, it
is necessary to demangle global symbols.

Also, LTO may generate symbols like:

__UNIQUE_ID_addressable___UNIQUE_ID_pci_invalid_bar_694_695

Remove trailing '_' together with numbers and '.' so that both numbers
added to the end of the symbol are removed. For example, the above s
ymbol will be demangled as

__UNIQUE_ID_addressable___UNIQUE_ID_pci_invalid_bar

Signed-off-by: Song Liu <[email protected]>
---
 tools/objtool/elf.c | 11 +++++++----
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
index 2c02c7b49265..b4a7ea4720e1 100644
--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -445,9 +445,6 @@ static const char *demangle_name(struct symbol *sym)
 {
        char *str;
 
-       if (!is_local_sym(sym))
-               return sym->name;
-
        if (!is_func_sym(sym) && !is_object_sym(sym))
                return sym->name;
 
@@ -463,7 +460,13 @@ static const char *demangle_name(struct symbol *sym)
        for (int i = strlen(str) - 1; i >= 0; i--) {
                char c = str[i];
 
-               if (!isdigit(c) && c != '.') {
+               /*
+                * With CONFIG_LTO_CLANG_THIN, the UNIQUE_ID field could
+                * be like:
+                *   __UNIQUE_ID_addressable___UNIQUE_ID_<name>_628_629
+                * Remove all the trailing number, '.', and '_'.
+                */
+               if (!isdigit(c) && c != '.' && c != '_') {
                        str[i + 1] = '\0';
                        break;
                }
-- 
2.47.3


Reply via email to