Messages in this thread Patch in this message |  | | From | Sathvika Vasireddy <> | | Subject | [PATCH v1 4/6] objtool/powerpc: Skip jump destination analysis and unnanotated intra-function call warnings for --ftr-fixup | | Date | Tue, 5 May 2026 14:16:26 +0530 |
| |
Objtool is throwing unannotated intra-function call warnings when run on vmlinux with --ftr-fixup option.
One such example:
vmlinux: warning: objtool: .text+0x3d94: unannotated intra-function call
.text + 0x3d94 = c000000000008000 + 3d94 = c0000000000081d4
c0000000000081d4: 45 24 02 48 bl c00000000002a618 <system_reset_exception+0x8>
c00000000002a610 <system_reset_exception>: c00000000002a610: 0e 01 4c 3c addis r2,r12,270 c00000000002a610: R_PPC64_REL16_HA .TOC. c00000000002a614: f0 6c 42 38 addi r2,r2,27888 c00000000002a614: R_PPC64_REL16_LO .TOC.+0x4 c00000000002a618: a6 02 08 7c mflr r0
This is happening because we should be looking for destination symbols that are at absolute offsets instead of relative offsets. After fixing dest_off to point to absolute offset, there are still a lot of these warnings shown.
In the above example, objtool is computing the destination offset to be c00000000002a618, which points to a completely different instruction. find_call_destination() is looking for this offset and failing. Instead, we should be looking for destination offset c00000000002a610 which points to system_reset_exception function.
Even after fixing the way destination offset is computed, and after looking for dest_off - 0x8 in cases where the original offset is not found, there are still a lot of unannotated intra-function call warnings generated. This is due to symbols that are not properly annotated.
So, for now, as a hack to curb these warnings, do not emit unannotated intra-function call warnings when objtool is run with --ftr-fixup option.
Skip add_jump_destinations() and suppress intra-function call errors in --ftr-fixup mode. The feature fixup pass only needs fixup entry tables, relocation entries from .__ftr_alternates.text, and elf_write_insn() to patch branch offsets.
Signed-off-by: Sathvika Vasireddy <sv@linux.ibm.com> --- tools/objtool/check.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-)
diff --git a/tools/objtool/check.c b/tools/objtool/check.c index f3501b149829..14644ca36d73 100644 --- a/tools/objtool/check.c +++ b/tools/objtool/check.c @@ -1644,7 +1644,6 @@ static int add_jump_destinations(struct objtool_file *file) dest_off == func->offset + func->len) continue; - ERROR_INSN(insn, "can't find jump dest instruction at %s", offstr(dest_sec, dest_off)); return -1; @@ -1727,8 +1726,11 @@ static int add_call_destinations(struct objtool_file *file) continue; if (!insn_call_dest(insn)) { - ERROR_INSN(insn, "unannotated intra-function call"); - return -1; + if (!opts.ftr_fixup) { + ERROR_INSN(insn, "unannotated intra-function call"); + return -1; + } + continue; } if (func && !is_func_sym(insn_call_dest(insn))) { @@ -2681,8 +2683,10 @@ static int decode_sections(struct objtool_file *file) return -1; } - if (add_jump_destinations(file)) - return -1; + if (!opts.ftr_fixup) { + if (add_jump_destinations(file)) + return -1; + } /* * Must be before add_call_destination(); it changes INSN_CALL to -- 2.43.0
|  |