libbpf: Improve handling of failed CO-RE relocations
authorAndrii Nakryiko <andriin@fb.com>
Fri, 24 Jan 2020 05:38:37 +0000 (21:38 -0800)
committerDaniel Borkmann <daniel@iogearbox.net>
Fri, 24 Jan 2020 21:16:26 +0000 (22:16 +0100)
commitd7a252708dbc950ca2064310217e8b9f85846e2f
tree22fc01fa40da05e5cb32a633298e6eef1bfac0ef
parent51bad0f05616c43d6d34b0a19bcc9bdab8e8fb39
libbpf: Improve handling of failed CO-RE relocations

Previously, if libbpf failed to resolve CO-RE relocation for some
instructions, it would either return error immediately, or, if
.relaxed_core_relocs option was set, would replace relocatable offset/imm part
of an instruction with a bogus value (-1). Neither approach is good, because
there are many possible scenarios where relocation is expected to fail (e.g.,
when some field knowingly can be missing on specific kernel versions). On the
other hand, replacing offset with invalid one can hide programmer errors, if
this relocation failue wasn't anticipated.

This patch deprecates .relaxed_core_relocs option and changes the approach to
always replacing instruction, for which relocation failed, with invalid BPF
helper call instruction. For cases where this is expected, BPF program should
already ensure that that instruction is unreachable, in which case this
invalid instruction is going to be silently ignored. But if instruction wasn't
guarded, BPF program will be rejected at verification step with verifier log
pointing precisely to the place in assembly where the problem is.

Signed-off-by: Andrii Nakryiko <andriin@fb.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
Acked-by: Martin KaFai Lau <kafai@fb.com>
Link: https://lore.kernel.org/bpf/20200124053837.2434679-1-andriin@fb.com
tools/lib/bpf/libbpf.c
tools/lib/bpf/libbpf.h