From: Daniel Borkmann Date: Sun, 7 Feb 2016 01:11:52 +0000 (+0100) Subject: tc, bpf: give some more hints wrt false relos X-Git-Tag: v4.5.0~84 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=a576c6b977f275ae5ffc0e94135c26b18ce5138a;p=thirdparty%2Fiproute2.git tc, bpf: give some more hints wrt false relos Provide some more hints to the user/developer when relos have been found that don't point to ld64 imm instruction. Ran couple of times into relos generated by clang [1], where the compiler tried to uninline inlined functions with eBPF and emitted BPF_JMP | BPF_CALL opcodes. If this seems the case, give a hint that the user should do a work-around to use always_inline annotation. [1] https://llvm.org/bugs/show_bug.cgi?id=26243#c3 Signed-off-by: Daniel Borkmann --- diff --git a/tc/tc_bpf.c b/tc/tc_bpf.c index a1286baab..5e80d0f98 100644 --- a/tc/tc_bpf.c +++ b/tc/tc_bpf.c @@ -1385,8 +1385,16 @@ static int bpf_apply_relo_data(struct bpf_elf_ctx *ctx, ioff = relo.r_offset / sizeof(struct bpf_insn); if (ioff >= num_insns || - insns[ioff].code != (BPF_LD | BPF_IMM | BPF_DW)) + insns[ioff].code != (BPF_LD | BPF_IMM | BPF_DW)) { + fprintf(stderr, "ELF contains relo data for non ld64 " + "instruction at offset %u! Compiler bug?!\n", + ioff); + if (ioff < num_insns && + insns[ioff].code == (BPF_JMP | BPF_CALL)) + fprintf(stderr, " - Try to annotate functions " + "with always_inline attribute!\n"); return -EINVAL; + } if (gelf_getsym(ctx->sym_tab, GELF_R_SYM(relo.r_info), &sym) != &sym) return -EIO;