Commit a1526bcf authored by Josh Poimboeuf's avatar Josh Poimboeuf
Browse files

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: default avatarPetr Mladek <pmladek@suse.com>
Tested-by: default avatarJoe Lawrence <joe.lawrence@redhat.com>
Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
parent c9e9b85d
Loading
Loading
Loading
Loading
+1 −4
Original line number Diff line number Diff line
@@ -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)
+7 −0
Original line number Diff line number Diff line
@@ -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;
+6 −0
Original line number Diff line number Diff line
@@ -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;