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:
Josh Poimboeuf
2025-09-17 09:03:39 -07:00
parent c9e9b85d41
commit a1526bcfcb
3 changed files with 14 additions and 4 deletions

View File

@@ -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)

View File

@@ -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;

View File

@@ -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;