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) {
|
if (func && insn_func(insn) && func != insn_func(insn)->pfunc) {
|
||||||
/* Ignore KCFI type preambles, which always fall through */
|
/* Ignore KCFI type preambles, which always fall through */
|
||||||
if (!strncmp(func->name, "__cfi_", 6) ||
|
if (is_prefix_func(func))
|
||||||
!strncmp(func->name, "__pfx_", 6) ||
|
|
||||||
!strncmp(func->name, "__pi___cfi_", 11) ||
|
|
||||||
!strncmp(func->name, "__pi___pfx_", 11))
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
if (file->ignore_unreachables)
|
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, &sym->hash, sym->idx);
|
||||||
elf_hash_add(symbol_name, &sym->name_hash, str_hash(sym->name));
|
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"))
|
if (is_func_sym(sym) && strstr(sym->name, ".cold"))
|
||||||
sym->cold = 1;
|
sym->cold = 1;
|
||||||
sym->pfunc = sym->cfunc = sym;
|
sym->pfunc = sym->cfunc = sym;
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ struct symbol {
|
|||||||
u8 ignore : 1;
|
u8 ignore : 1;
|
||||||
u8 nocfi : 1;
|
u8 nocfi : 1;
|
||||||
u8 cold : 1;
|
u8 cold : 1;
|
||||||
|
u8 prefix : 1;
|
||||||
struct list_head pv_target;
|
struct list_head pv_target;
|
||||||
struct reloc *relocs;
|
struct reloc *relocs;
|
||||||
struct section *group_sec;
|
struct section *group_sec;
|
||||||
@@ -230,6 +231,11 @@ static inline bool is_local_sym(struct symbol *sym)
|
|||||||
return sym->bind == STB_LOCAL;
|
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)
|
static inline bool is_reloc_sec(struct section *sec)
|
||||||
{
|
{
|
||||||
return sec->sh.sh_type == SHT_RELA || sec->sh.sh_type == SHT_REL;
|
return sec->sh.sh_type == SHT_RELA || sec->sh.sh_type == SHT_REL;
|
||||||
|
|||||||
Reference in New Issue
Block a user