Commit 9205a322 authored by Josh Poimboeuf's avatar Josh Poimboeuf Committed by Peter Zijlstra
Browse files

objtool: Return canonical symbol when aliases exist in symbol finding helpers



When symbol alias ambiguity exists in the symbol finding helper
functions, return the canonical sym->alias, as that's the one which gets
used by validate_branch() and elsewhere.

This doesn't fix any known issues, just makes the symbol alias behavior
more robust.

Signed-off-by: default avatarJosh Poimboeuf <jpoimboe@kernel.org>
Signed-off-by: default avatarPeter Zijlstra (Intel) <peterz@infradead.org>
Link: https://patch.msgid.link/450470a4897706af77453ad333e18af5ebab653c.1763671318.git.jpoimboe@kernel.org
parent 16f366c5
Loading
Loading
Loading
Loading
+13 −13
Original line number Diff line number Diff line
@@ -172,11 +172,11 @@ static struct symbol *find_symbol_by_index(struct elf *elf, unsigned int idx)
struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset)
{
	struct rb_root_cached *tree = (struct rb_root_cached *)&sec->symbol_tree;
	struct symbol *iter;
	struct symbol *sym;

	__sym_for_each(iter, tree, offset, offset) {
		if (iter->offset == offset && !is_sec_sym(iter))
			return iter;
	__sym_for_each(sym, tree, offset, offset) {
		if (sym->offset == offset && !is_sec_sym(sym))
			return sym->alias;
	}

	return NULL;
@@ -185,11 +185,11 @@ struct symbol *find_symbol_by_offset(struct section *sec, unsigned long offset)
struct symbol *find_func_by_offset(struct section *sec, unsigned long offset)
{
	struct rb_root_cached *tree = (struct rb_root_cached *)&sec->symbol_tree;
	struct symbol *iter;
	struct symbol *func;

	__sym_for_each(iter, tree, offset, offset) {
		if (iter->offset == offset && is_func_sym(iter))
			return iter;
	__sym_for_each(func, tree, offset, offset) {
		if (func->offset == offset && is_func_sym(func))
			return func->alias;
	}

	return NULL;
@@ -220,7 +220,7 @@ struct symbol *find_symbol_containing(const struct section *sec, unsigned long o
		}
	}

	return sym;
	return sym ? sym->alias : NULL;
}

/*
@@ -266,11 +266,11 @@ int find_symbol_hole_containing(const struct section *sec, unsigned long offset)
struct symbol *find_func_containing(struct section *sec, unsigned long offset)
{
	struct rb_root_cached *tree = (struct rb_root_cached *)&sec->symbol_tree;
	struct symbol *iter;
	struct symbol *func;

	__sym_for_each(iter, tree, offset, offset) {
		if (is_func_sym(iter))
			return iter;
	__sym_for_each(func, tree, offset, offset) {
		if (is_func_sym(func))
			return func->alias;
	}

	return NULL;