Objtool throws a lot of can't find starting instruction warnings when run on vmlinux with --ftr-fixup option.
These warnings are seen because find_insn() function looks for instructions at offsets that are relative to the start of the section. In case of individual object files (.o), there are no can't find starting instruction warnings seen because the actual offset associated with an instruction is itself a relative offset since the sections start at offset 0x0. However, in case of vmlinux, find_insn() function fails to find instructions at the actual offset associated with an instruction since the sections in vmlinux do not start at offset 0x0. Due to this, find_insn() will look for absolute offset and not the relative offset. This is resulting in a lot of can't find starting instruction warnings when objtool is run on vmlinux. To fix this, pass offset that is relative to the start of the section to find_insn(). find_insn() is also looking for symbols of size 0. But, objtool does not store empty STT_NOTYPE symbols in the rbtree. Due to this, for empty symbols, objtool is throwing can't find starting instruction warnings. Fix this by ignoring symbols that are of size 0 since objtool does not add them to the rbtree. Signed-off-by: Sathvika Vasireddy <[email protected]> --- tools/objtool/check.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/tools/objtool/check.c b/tools/objtool/check.c index 667d95431793..92fe5dc05cdb 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -492,7 +492,11 @@ static int decode_instructions(struct objtool_file *file) if (func->embedded_insn || func->alias != func) continue; - if (!find_insn(file, sec, func->offset)) { + if (func->len == 0) + continue; + + if (!find_insn(file, sec, opts.ftr_fixup ? + func->offset - sec->sym->offset : func->offset)) { ERROR("%s(): can't find starting instruction", func->name); return -1; } -- 2.43.0
