From 42f2a98c68b56fbf2af6757ab86e2905435ecaaa Mon Sep 17 00:00:00 2001 From: Timo Beckers Date: Fri, 18 Feb 2022 16:20:33 +0100 Subject: [PATCH] linker: rename fixupJumpsAndCalls to fixupAndValidate Also moves the probe_read_kernel rewrite to its own function. Signed-off-by: Timo Beckers --- linker.go | 42 +++++++++++++++++++++++++----------------- prog.go | 2 +- 2 files changed, 26 insertions(+), 18 deletions(-) diff --git a/linker.go b/linker.go index 484df7091..f9cf84cd2 100644 --- a/linker.go +++ b/linker.go @@ -114,9 +114,10 @@ func marshalLineInfos(layout []reference) ([]byte, error) { return buf.Bytes(), nil } -func fixupJumpsAndCalls(insns asm.Instructions) error { - // fixupBPFCalls replaces bpf_probe_read_{kernel,user}[_str] with bpf_probe_read[_str] on older kernels - // https://github.com/libbpf/libbpf/blob/master/src/libbpf.c#L6009 +// fixupAndValidate is called by the ELF reader right before marshaling the +// instruction stream. It performs last-minute adjustments to the program and +// runs some sanity checks before sending it off to the kernel. +func fixupAndValidate(insns asm.Instructions) error { iter := insns.Iterate() for iter.Next() { ins := iter.Ins @@ -125,21 +126,28 @@ func fixupJumpsAndCalls(insns asm.Instructions) error { return fmt.Errorf("instruction %d: map %s: %w", iter.Index, ins.Reference, asm.ErrUnsatisfiedMapReference) } - if !ins.IsBuiltinCall() { - continue - } - - switch asm.BuiltinFunc(ins.Constant) { - case asm.FnProbeReadKernel, asm.FnProbeReadUser: - if err := haveProbeReadKernel(); err != nil { - ins.Constant = int64(asm.FnProbeRead) - } - case asm.FnProbeReadKernelStr, asm.FnProbeReadUserStr: - if err := haveProbeReadKernel(); err != nil { - ins.Constant = int64(asm.FnProbeReadStr) - } - } + fixupProbeReadKernel(ins) } return nil } + +// fixupProbeReadKernel replaces calls to bpf_probe_read_{kernel,user}(_str) +// with bpf_probe_read(_str) on kernels that don't support it yet. +func fixupProbeReadKernel(ins *asm.Instruction) { + if !ins.IsBuiltinCall() { + return + } + + // Kernel supports bpf_probe_read_kernel, nothing to do. + if haveProbeReadKernel() == nil { + return + } + + switch asm.BuiltinFunc(ins.Constant) { + case asm.FnProbeReadKernel, asm.FnProbeReadUser: + ins.Constant = int64(asm.FnProbeRead) + case asm.FnProbeReadKernelStr, asm.FnProbeReadUserStr: + ins.Constant = int64(asm.FnProbeReadStr) + } +} diff --git a/prog.go b/prog.go index 974fb7b7c..7490b384b 100644 --- a/prog.go +++ b/prog.go @@ -330,7 +330,7 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, handles *hand return nil, fmt.Errorf("CO-RE fixup: %w", err) } - if err := fixupJumpsAndCalls(insns); err != nil { + if err := fixupAndValidate(insns); err != nil { return nil, err }