objtool: Fix STACK_FRAME_NON_STANDARD macro checking for function symbols
Mathieu Desnoyers reported that the STACK_FRAME_NON_STANDARD macro wasn't working with the lttng_filter_interpret_bytecode() function in the lttng-modules code. Usually the relocation created by STACK_FRAME_NON_STANDARD creates a reference to a section symbol like this: Offset Type Value Addend Name 000000000000000000 X86_64_64 000000000000000000 +3136 .text But in this case it created a reference to a function symbol: Offset Type Value Addend Name 000000000000000000 X86_64_64 0x00000000000003a0 +0 lttng_filter_interpret_bytecode To be honest I have no idea what causes gcc to decide to do one over the other. But both are valid ELF, so add support for the function symbol. Reported-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com> Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Linus Torvalds <torvalds@linux-foundation.org> Cc: Peter Zijlstra <peterz@infradead.org> Cc: Thomas Gleixner <tglx@linutronix.de> Cc: lttng-dev@lists.lttng.org Link: http://lkml.kernel.org/r/9cee42843bc6d94e990a152e4e0319cfdf6756ef.1466023450.git.jpoimboe@redhat.com Signed-off-by: Ingo Molnar <mingo@kernel.org>
This commit is contained in:
parent
ee40fb2948
commit
0ea5ad869c
|
@ -122,10 +122,14 @@ static bool ignore_func(struct objtool_file *file, struct symbol *func)
|
||||||
|
|
||||||
/* check for STACK_FRAME_NON_STANDARD */
|
/* check for STACK_FRAME_NON_STANDARD */
|
||||||
if (file->whitelist && file->whitelist->rela)
|
if (file->whitelist && file->whitelist->rela)
|
||||||
list_for_each_entry(rela, &file->whitelist->rela->rela_list, list)
|
list_for_each_entry(rela, &file->whitelist->rela->rela_list, list) {
|
||||||
if (rela->sym->sec == func->sec &&
|
if (rela->sym->type == STT_SECTION &&
|
||||||
|
rela->sym->sec == func->sec &&
|
||||||
rela->addend == func->offset)
|
rela->addend == func->offset)
|
||||||
return true;
|
return true;
|
||||||
|
if (rela->sym->type == STT_FUNC && rela->sym == func)
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/* check if it has a context switching instruction */
|
/* check if it has a context switching instruction */
|
||||||
func_for_each_insn(file, func, insn)
|
func_for_each_insn(file, func, insn)
|
||||||
|
|
Loading…
Reference in New Issue