mirror of
https://github.com/torvalds/linux.git
synced 2025-12-07 20:06:24 +00:00
objtool: Mark prefix functions
In preparation for the objtool klp diff subcommand, introduce a flag to identify __pfx_*() and __cfi_*() functions in advance so they don't need to be manually identified every time a check is needed. Acked-by: Petr Mladek <pmladek@suse.com> Tested-by: Joe Lawrence <joe.lawrence@redhat.com> Signed-off-by: Josh Poimboeuf <jpoimboe@kernel.org>
This commit is contained in:
@@ -3568,10 +3568,7 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
|
||||
|
||||
if (func && insn_func(insn) && func != insn_func(insn)->pfunc) {
|
||||
/* Ignore KCFI type preambles, which always fall through */
|
||||
if (!strncmp(func->name, "__cfi_", 6) ||
|
||||
!strncmp(func->name, "__pfx_", 6) ||
|
||||
!strncmp(func->name, "__pi___cfi_", 11) ||
|
||||
!strncmp(func->name, "__pi___pfx_", 11))
|
||||
if (is_prefix_func(func))
|
||||
return 0;
|
||||
|
||||
if (file->ignore_unreachables)
|
||||
|
||||
@@ -442,6 +442,13 @@ static void elf_add_symbol(struct elf *elf, struct symbol *sym)
|
||||
elf_hash_add(symbol, &sym->hash, sym->idx);
|
||||
elf_hash_add(symbol_name, &sym->name_hash, str_hash(sym->name));
|
||||
|
||||
if (is_func_sym(sym) &&
|
||||
(strstarts(sym->name, "__pfx_") ||
|
||||
strstarts(sym->name, "__cfi_") ||
|
||||
strstarts(sym->name, "__pi___pfx_") ||
|
||||
strstarts(sym->name, "__pi___cfi_")))
|
||||
sym->prefix = 1;
|
||||
|
||||
if (is_func_sym(sym) && strstr(sym->name, ".cold"))
|
||||
sym->cold = 1;
|
||||
sym->pfunc = sym->cfunc = sym;
|
||||
|
||||
@@ -73,6 +73,7 @@ struct symbol {
|
||||
u8 ignore : 1;
|
||||
u8 nocfi : 1;
|
||||
u8 cold : 1;
|
||||
u8 prefix : 1;
|
||||
struct list_head pv_target;
|
||||
struct reloc *relocs;
|
||||
struct section *group_sec;
|
||||
@@ -230,6 +231,11 @@ static inline bool is_local_sym(struct symbol *sym)
|
||||
return sym->bind == STB_LOCAL;
|
||||
}
|
||||
|
||||
static inline bool is_prefix_func(struct symbol *sym)
|
||||
{
|
||||
return sym->prefix;
|
||||
}
|
||||
|
||||
static inline bool is_reloc_sec(struct section *sec)
|
||||
{
|
||||
return sec->sh.sh_type == SHT_RELA || sec->sh.sh_type == SHT_REL;
|
||||
|
||||
Reference in New Issue
Block a user