mirror of
git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
synced 2025-08-05 16:54:27 +00:00
objtool: Allow symbol range comparisons for IBT/ENDBR
A semi common pattern is where code checks if a code address is within a specific range. All text addresses require either ENDBR or ANNOTATE_ENDBR, however the ANNOTATE_NOENDBR past the range is unnatural. Instead, suppress this warning when this is exactly at the end of a symbol that itself starts with either ENDBR/ANNOTATE_ENDBR. Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lore.kernel.org/r/20220915111146.434642471@infradead.org
This commit is contained in:
parent
5da6aea375
commit
08ef8c4011
2 changed files with 28 additions and 1 deletions
|
@ -128,7 +128,6 @@ SYM_INNER_LABEL(entry_SYSENTER_compat_after_hwframe, SYM_L_GLOBAL)
|
|||
popfq
|
||||
jmp .Lsysenter_flags_fixed
|
||||
SYM_INNER_LABEL(__end_entry_SYSENTER_compat, SYM_L_GLOBAL)
|
||||
ANNOTATE_NOENDBR // is_sysenter_singlestep
|
||||
SYM_CODE_END(entry_SYSENTER_compat)
|
||||
|
||||
/*
|
||||
|
|
|
@ -4033,6 +4033,24 @@ static void mark_endbr_used(struct instruction *insn)
|
|||
list_del_init(&insn->call_node);
|
||||
}
|
||||
|
||||
static bool noendbr_range(struct objtool_file *file, struct instruction *insn)
|
||||
{
|
||||
struct symbol *sym = find_symbol_containing(insn->sec, insn->offset-1);
|
||||
struct instruction *first;
|
||||
|
||||
if (!sym)
|
||||
return false;
|
||||
|
||||
first = find_insn(file, sym->sec, sym->offset);
|
||||
if (!first)
|
||||
return false;
|
||||
|
||||
if (first->type != INSN_ENDBR && !first->noendbr)
|
||||
return false;
|
||||
|
||||
return insn->offset == sym->offset + sym->len;
|
||||
}
|
||||
|
||||
static int validate_ibt_insn(struct objtool_file *file, struct instruction *insn)
|
||||
{
|
||||
struct instruction *dest;
|
||||
|
@ -4105,9 +4123,19 @@ static int validate_ibt_insn(struct objtool_file *file, struct instruction *insn
|
|||
continue;
|
||||
}
|
||||
|
||||
/*
|
||||
* Accept anything ANNOTATE_NOENDBR.
|
||||
*/
|
||||
if (dest->noendbr)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* Accept if this is the instruction after a symbol
|
||||
* that is (no)endbr -- typical code-range usage.
|
||||
*/
|
||||
if (noendbr_range(file, dest))
|
||||
continue;
|
||||
|
||||
WARN_FUNC("relocation to !ENDBR: %s",
|
||||
insn->sec, insn->offset,
|
||||
offstr(dest->sec, dest->offset));
|
||||
|
|
Loading…
Add table
Reference in a new issue