summaryrefslogtreecommitdiff
path: root/tools/objtool
diff options
context:
space:
mode:
Diffstat (limited to 'tools/objtool')
-rw-r--r--tools/objtool/elf.c10
1 files changed, 9 insertions, 1 deletions
diff --git a/tools/objtool/elf.c b/tools/objtool/elf.c
index 3f20b257ab25..7895f65aca2a 100644
--- a/tools/objtool/elf.c
+++ b/tools/objtool/elf.c
@@ -502,8 +502,16 @@ static int elf_add_symbol(struct elf *elf, struct symbol *sym)
if (strstarts(sym->name, ".klp.sym"))
sym->klp = 1;
- if (!sym->klp && is_func_sym(sym) && strstr(sym->name, ".cold"))
+ if (!sym->klp && !is_sec_sym(sym) && strstr(sym->name, ".cold")) {
sym->cold = 1;
+
+ /*
+ * Clang doesn't mark cold subfunctions as STT_FUNC, which
+ * breaks several objtool assumptions. Fake it.
+ */
+ sym->type = STT_FUNC;
+ }
+
sym->pfunc = sym->cfunc = sym;
sym->demangled_name = demangle_name(sym);