diff options
Diffstat (limited to '')
-rw-r--r-- | tools/objtool/check.c | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 0d9f9cfc27be..f2a84271e807 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -266,7 +266,8 @@ static int decode_instructions(struct objtool_file *file) strncmp(sec->name, ".discard.", 9)) sec->text = true; - if (!strcmp(sec->name, ".noinstr.text")) + if (!strcmp(sec->name, ".noinstr.text") || + !strcmp(sec->name, ".entry.text")) sec->noinstr = true; for (offset = 0; offset < sec->len; offset += insn->len) { @@ -2071,7 +2072,7 @@ static inline const char *call_dest_name(struct instruction *insn) static int validate_call(struct instruction *insn, struct insn_state *state) { if (state->noinstr && state->instr <= 0 && - (!insn->call_dest || insn->call_dest->sec != insn->sec)) { + (!insn->call_dest || !insn->call_dest->sec->noinstr)) { WARN_FUNC("call to %s() leaves .noinstr.text section", insn->sec, insn->offset, call_dest_name(insn)); return 1; @@ -2558,11 +2559,16 @@ static int validate_vmlinux_functions(struct objtool_file *file) int warnings = 0; sec = find_section_by_name(file->elf, ".noinstr.text"); - if (!sec) - return 0; + if (sec) { + warnings += validate_section(file, sec); + warnings += validate_unwind_hints(file, sec); + } - warnings += validate_section(file, sec); - warnings += validate_unwind_hints(file, sec); + sec = find_section_by_name(file->elf, ".entry.text"); + if (sec) { + warnings += validate_section(file, sec); + warnings += validate_unwind_hints(file, sec); + } return warnings; } |