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
