@@ -236,7 +236,7 @@ func NewProgramWithOptions(spec *ProgramSpec, opts ProgramOptions) (*Program, er
236
236
return nil , errors .New ("can't load a program from a nil spec" )
237
237
}
238
238
239
- prog , err := newProgramWithOptions (spec , opts , newBTFCache ( & opts ))
239
+ prog , err := newProgramWithOptions (spec , opts , btf . NewCache ( ))
240
240
if errors .Is (err , asm .ErrUnsatisfiedMapReference ) {
241
241
return nil , fmt .Errorf ("cannot load program without loading its whole collection: %w" , err )
242
242
}
@@ -297,7 +297,7 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
297
297
copy (insns , spec .Instructions )
298
298
299
299
var b btf.Builder
300
- if err := applyRelocations (insns , spec .ByteOrder , & b , c , opts .ExtraRelocationTargets ); err != nil {
300
+ if err := applyRelocations (insns , spec .ByteOrder , & b , c , opts .KernelTypes , opts . ExtraRelocationTargets ); err != nil {
301
301
return nil , fmt .Errorf ("apply CO-RE relocations: %w" , err )
302
302
}
303
303
@@ -350,7 +350,7 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
350
350
return nil , err
351
351
}
352
352
353
- handles , err := fixupKfuncs (insns )
353
+ handles , err := fixupKfuncs (insns , c )
354
354
if err != nil {
355
355
return nil , fmt .Errorf ("fixing up kfuncs: %w" , err )
356
356
}
@@ -381,7 +381,7 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
381
381
attr .AttachBtfObjFd = uint32 (spec .AttachTarget .FD ())
382
382
defer runtime .KeepAlive (spec .AttachTarget )
383
383
} else if spec .AttachTo != "" {
384
- module , targetID , err := findProgramTargetInKernel (spec .AttachTo , spec .Type , spec .AttachType )
384
+ module , targetID , err := findProgramTargetInKernel (spec .AttachTo , spec .Type , spec .AttachType , c )
385
385
if err != nil && ! errors .Is (err , errUnrecognizedAttachType ) {
386
386
// We ignore errUnrecognizedAttachType since AttachTo may be non-empty
387
387
// for programs that don't attach anywhere.
@@ -1027,7 +1027,7 @@ var errUnrecognizedAttachType = errors.New("unrecognized attach type")
1027
1027
//
1028
1028
// Returns errUnrecognizedAttachType if the combination of progType and attachType
1029
1029
// is not recognised.
1030
- func findProgramTargetInKernel (name string , progType ProgramType , attachType AttachType ) (* btf.Handle , btf.TypeID , error ) {
1030
+ func findProgramTargetInKernel (name string , progType ProgramType , attachType AttachType , cache * btf. Cache ) (* btf.Handle , btf.TypeID , error ) {
1031
1031
type match struct {
1032
1032
p ProgramType
1033
1033
a AttachType
@@ -1067,12 +1067,7 @@ func findProgramTargetInKernel(name string, progType ProgramType, attachType Att
1067
1067
return nil , 0 , errUnrecognizedAttachType
1068
1068
}
1069
1069
1070
- spec , err := btf .LoadKernelSpec ()
1071
- if err != nil {
1072
- return nil , 0 , fmt .Errorf ("load kernel spec: %w" , err )
1073
- }
1074
-
1075
- spec , module , err := findTargetInKernel (spec , typeName , & target )
1070
+ spec , module , err := findTargetInKernel (typeName , & target , cache )
1076
1071
if errors .Is (err , btf .ErrNotFound ) {
1077
1072
return nil , 0 , & internal.UnsupportedFeatureError {Name : featureName }
1078
1073
}
@@ -1102,14 +1097,15 @@ func findProgramTargetInKernel(name string, progType ProgramType, attachType Att
1102
1097
//
1103
1098
// Returns a non-nil handle if the type was found in a module, or btf.ErrNotFound
1104
1099
// if the type wasn't found at all.
1105
- func findTargetInKernel (kernelSpec * btf.Spec , typeName string , target * btf.Type ) (* btf.Spec , * btf.Handle , error ) {
1106
- if kernelSpec == nil {
1107
- return nil , nil , fmt .Errorf ("nil kernelSpec: %w" , btf .ErrNotFound )
1100
+ func findTargetInKernel (typeName string , target * btf.Type , cache * btf.Cache ) (* btf.Spec , * btf.Handle , error ) {
1101
+ kernelSpec , err := cache .Kernel ()
1102
+ if err != nil {
1103
+ return nil , nil , err
1108
1104
}
1109
1105
1110
- err : = kernelSpec .TypeByName (typeName , target )
1106
+ err = kernelSpec .TypeByName (typeName , target )
1111
1107
if errors .Is (err , btf .ErrNotFound ) {
1112
- spec , module , err := findTargetInModule (kernelSpec , typeName , target )
1108
+ spec , module , err := findTargetInModule (typeName , target , cache )
1113
1109
if err != nil {
1114
1110
return nil , nil , fmt .Errorf ("find target in modules: %w" , err )
1115
1111
}
@@ -1127,7 +1123,7 @@ func findTargetInKernel(kernelSpec *btf.Spec, typeName string, target *btf.Type)
1127
1123
// are searched in the order they were loaded.
1128
1124
//
1129
1125
// Returns btf.ErrNotFound if the target can't be found in any module.
1130
- func findTargetInModule (base * btf. Spec , typeName string , target * btf.Type ) (* btf.Spec , * btf.Handle , error ) {
1126
+ func findTargetInModule (typeName string , target * btf.Type , cache * btf. Cache ) (* btf.Spec , * btf.Handle , error ) {
1131
1127
it := new (btf.HandleIterator )
1132
1128
defer it .Handle .Close ()
1133
1129
@@ -1141,7 +1137,7 @@ func findTargetInModule(base *btf.Spec, typeName string, target *btf.Type) (*btf
1141
1137
continue
1142
1138
}
1143
1139
1144
- spec , err := it . Handle . Spec ( base )
1140
+ spec , err := cache . Module ( info . Name )
1145
1141
if err != nil {
1146
1142
return nil , nil , fmt .Errorf ("parse types for module %s: %w" , info .Name , err )
1147
1143
}
@@ -1201,12 +1197,3 @@ func findTargetInProgram(prog *Program, name string, progType ProgramType, attac
1201
1197
1202
1198
return spec .TypeID (targetFunc )
1203
1199
}
1204
-
1205
- func newBTFCache (opts * ProgramOptions ) * btf.Cache {
1206
- c := btf .NewCache ()
1207
- if opts .KernelTypes != nil {
1208
- c .KernelTypes = opts .KernelTypes
1209
- c .LoadedModules = []string {}
1210
- }
1211
- return c
1212
- }
0 commit comments