Skip to content

Commit d994daa

Browse files
mauriciovasquezbernallmb
authored andcommitted
program: Allow passing extra targets for CO-RE relocations
This commit introduces a new ExtraRelocationTargets field on ProgramOptions to llow users to pass additional targets (besides the kernel types) to perform CO-RE relocations. The KernelModuleTypes field is removed as ExtraRelocationTargets covers its functionality. This is used in Inspektor Gadget to perform relocations against a shared map that contains fields whose sizes change according to the runtime configuration. Signed-off-by: Mauricio Vásquez <[email protected]>
1 parent 8b53d11 commit d994daa

File tree

5 files changed

+49
-45
lines changed

5 files changed

+49
-45
lines changed

btf/core_reloc_test.go

Lines changed: 38 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,7 @@ func TestCORERelocationLoad(t *testing.T) {
3636
}
3737

3838
prog, err := ebpf.NewProgramWithOptions(progSpec, ebpf.ProgramOptions{
39-
KernelTypes: spec.Types,
40-
KernelModuleTypes: map[string]*btf.Spec{},
39+
KernelTypes: spec.Types,
4140
})
4241
testutils.SkipIfNotSupported(t, err)
4342

@@ -81,28 +80,45 @@ func TestCORERelocationRead(t *testing.T) {
8180
t.Fatal(err)
8281
}
8382

83+
tests := []struct {
84+
name string
85+
opts ebpf.ProgramOptions
86+
}{
87+
{
88+
name: "KernelTypes",
89+
opts: ebpf.ProgramOptions{
90+
KernelTypes: targetSpec,
91+
},
92+
},
93+
{
94+
name: "ExtraRelocationTargets",
95+
opts: ebpf.ProgramOptions{
96+
ExtraRelocationTargets: []*btf.Spec{targetSpec},
97+
},
98+
},
99+
}
100+
84101
for _, progSpec := range spec.Programs {
85-
t.Run(progSpec.Name, func(t *testing.T) {
86-
prog, err := ebpf.NewProgramWithOptions(progSpec, ebpf.ProgramOptions{
87-
KernelTypes: targetSpec,
88-
KernelModuleTypes: map[string]*btf.Spec{},
89-
})
90-
testutils.SkipIfNotSupported(t, err)
91-
if err != nil {
92-
t.Fatal("Load program:", err)
93-
}
94-
defer prog.Close()
102+
for _, test := range tests {
103+
t.Run(progSpec.Name+"_"+test.name, func(t *testing.T) {
104+
prog, err := ebpf.NewProgramWithOptions(progSpec, test.opts)
105+
testutils.SkipIfNotSupported(t, err)
106+
if err != nil {
107+
t.Fatal("Load program:", err)
108+
}
109+
defer prog.Close()
95110

96-
ret, _, err := prog.Test(internal.EmptyBPFContext)
97-
testutils.SkipIfNotSupported(t, err)
98-
if err != nil {
99-
t.Fatal("Error when running:", err)
100-
}
111+
ret, _, err := prog.Test(internal.EmptyBPFContext)
112+
testutils.SkipIfNotSupported(t, err)
113+
if err != nil {
114+
t.Fatal("Error when running:", err)
115+
}
101116

102-
if ret != 0 {
103-
t.Error("Assertion failed on line", ret)
104-
}
105-
})
117+
if ret != 0 {
118+
t.Error("Assertion failed on line", ret)
119+
}
120+
})
121+
}
106122
}
107123
}
108124

@@ -151,8 +167,7 @@ func TestCOREPoisonLineInfo(t *testing.T) {
151167
t.Run(test.name, func(t *testing.T) {
152168
t.Log(progSpec.Instructions)
153169
_, err := ebpf.NewProgramWithOptions(progSpec, ebpf.ProgramOptions{
154-
KernelTypes: empty,
155-
KernelModuleTypes: map[string]*btf.Spec{},
170+
KernelTypes: empty,
156171
})
157172
testutils.SkipIfNotSupported(t, err)
158173

elf_reader_test.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1130,7 +1130,6 @@ func TestLibBPFCompat(t *testing.T) {
11301130

11311131
opts := opts // copy
11321132
opts.Programs.KernelTypes = btfSpec
1133-
opts.Programs.KernelModuleTypes = map[string]*btf.Spec{}
11341133
load(t, spec, opts, valid)
11351134
})
11361135
}

linker.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ func hasFunctionReferences(insns asm.Instructions) bool {
124124
//
125125
// Passing a nil target will relocate against the running kernel. insns are
126126
// modified in place.
127-
func applyRelocations(insns asm.Instructions, bo binary.ByteOrder, b *btf.Builder, c *btf.Cache) error {
127+
func applyRelocations(insns asm.Instructions, bo binary.ByteOrder, b *btf.Builder, c *btf.Cache, extraTargets []*btf.Spec) error {
128128
var relos []*btf.CORERelocation
129129
var reloInsns []*asm.Instruction
130130
iter := insns.Iterate()
@@ -155,7 +155,7 @@ func applyRelocations(insns asm.Instructions, bo binary.ByteOrder, b *btf.Builde
155155
return err
156156
}
157157

158-
targets := make([]*btf.Spec, 0, 1+len(modules))
158+
targets := make([]*btf.Spec, 0, 1+len(modules)+len(extraTargets))
159159
targets = append(targets, kernelTarget)
160160

161161
for _, kmod := range modules {
@@ -167,6 +167,8 @@ func applyRelocations(insns asm.Instructions, bo binary.ByteOrder, b *btf.Builde
167167
targets = append(targets, spec)
168168
}
169169

170+
targets = append(targets, extraTargets...)
171+
170172
fixups, err := btf.CORERelocate(relos, targets, bo, b.Add)
171173
if err != nil {
172174
return err

prog.go

Lines changed: 6 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import (
88
"math"
99
"path/filepath"
1010
"runtime"
11-
"sort"
1211
"time"
1312

1413
"github.com/cilium/ebpf/asm"
@@ -95,13 +94,10 @@ type ProgramOptions struct {
9594
// use the kernel BTF from a well-known location if nil.
9695
KernelTypes *btf.Spec
9796

98-
// Type information used for CO-RE relocations of kernel modules,
99-
// indexed by module name.
100-
//
101-
// This is useful in environments where the kernel BTF is not available
102-
// (containers) or where it is in a non-standard location. Defaults to
103-
// use the kernel module BTF from a well-known location if nil.
104-
KernelModuleTypes map[string]*btf.Spec
97+
// Additional targets to consider for CO-RE relocations. This can be used to
98+
// pass BTF information for kernel modules when it's not present on
99+
// KernelTypes.
100+
ExtraRelocationTargets []*btf.Spec
105101
}
106102

107103
// ProgramSpec defines a Program.
@@ -293,7 +289,7 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
293289
copy(insns, spec.Instructions)
294290

295291
var b btf.Builder
296-
if err := applyRelocations(insns, spec.ByteOrder, &b, c); err != nil {
292+
if err := applyRelocations(insns, spec.ByteOrder, &b, c, opts.ExtraRelocationTargets); err != nil {
297293
return nil, fmt.Errorf("apply CO-RE relocations: %w", err)
298294
}
299295

@@ -1202,14 +1198,7 @@ func newBTFCache(opts *ProgramOptions) *btf.Cache {
12021198
c := btf.NewCache()
12031199
if opts.KernelTypes != nil {
12041200
c.KernelTypes = opts.KernelTypes
1205-
c.ModuleTypes = opts.KernelModuleTypes
1206-
if opts.KernelModuleTypes != nil {
1207-
c.LoadedModules = []string{}
1208-
for name := range opts.KernelModuleTypes {
1209-
c.LoadedModules = append(c.LoadedModules, name)
1210-
}
1211-
sort.Strings(c.LoadedModules)
1212-
}
1201+
c.LoadedModules = []string{}
12131202
}
12141203
return c
12151204
}

prog_test.go

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -881,8 +881,7 @@ func TestProgramLoadErrors(t *testing.T) {
881881
t.Run(test.name, func(t *testing.T) {
882882
t.Log(progSpec.Instructions)
883883
_, err := newProgram(t, progSpec, &ProgramOptions{
884-
KernelTypes: empty,
885-
KernelModuleTypes: map[string]*btf.Spec{},
884+
KernelTypes: empty,
886885
})
887886
testutils.SkipIfNotSupported(t, err)
888887

0 commit comments

Comments
 (0)