@@ -236,7 +236,7 @@ func NewProgramWithOptions(spec *ProgramSpec, opts ProgramOptions) (*Program, er
236236 return nil , errors .New ("can't load a program from a nil spec" )
237237 }
238238
239- prog , err := newProgramWithOptions (spec , opts , newBTFCache ( & opts ))
239+ prog , err := newProgramWithOptions (spec , opts , btf . NewCache ( ))
240240 if errors .Is (err , asm .ErrUnsatisfiedMapReference ) {
241241 return nil , fmt .Errorf ("cannot load program without loading its whole collection: %w" , err )
242242 }
@@ -297,7 +297,7 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
297297 copy (insns , spec .Instructions )
298298
299299 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 {
301301 return nil , fmt .Errorf ("apply CO-RE relocations: %w" , err )
302302 }
303303
@@ -350,7 +350,7 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
350350 return nil , err
351351 }
352352
353- handles , err := fixupKfuncs (insns )
353+ handles , err := fixupKfuncs (insns , c )
354354 if err != nil {
355355 return nil , fmt .Errorf ("fixing up kfuncs: %w" , err )
356356 }
@@ -381,7 +381,7 @@ func newProgramWithOptions(spec *ProgramSpec, opts ProgramOptions, c *btf.Cache)
381381 attr .AttachBtfObjFd = uint32 (spec .AttachTarget .FD ())
382382 defer runtime .KeepAlive (spec .AttachTarget )
383383 } 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 )
385385 if err != nil && ! errors .Is (err , errUnrecognizedAttachType ) {
386386 // We ignore errUnrecognizedAttachType since AttachTo may be non-empty
387387 // for programs that don't attach anywhere.
@@ -1027,7 +1027,7 @@ var errUnrecognizedAttachType = errors.New("unrecognized attach type")
10271027//
10281028// Returns errUnrecognizedAttachType if the combination of progType and attachType
10291029// 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 ) {
10311031 type match struct {
10321032 p ProgramType
10331033 a AttachType
@@ -1067,12 +1067,7 @@ func findProgramTargetInKernel(name string, progType ProgramType, attachType Att
10671067 return nil , 0 , errUnrecognizedAttachType
10681068 }
10691069
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 )
10761071 if errors .Is (err , btf .ErrNotFound ) {
10771072 return nil , 0 , & internal.UnsupportedFeatureError {Name : featureName }
10781073 }
@@ -1102,14 +1097,15 @@ func findProgramTargetInKernel(name string, progType ProgramType, attachType Att
11021097//
11031098// Returns a non-nil handle if the type was found in a module, or btf.ErrNotFound
11041099// 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
11081104 }
11091105
1110- err : = kernelSpec .TypeByName (typeName , target )
1106+ err = kernelSpec .TypeByName (typeName , target )
11111107 if errors .Is (err , btf .ErrNotFound ) {
1112- spec , module , err := findTargetInModule (kernelSpec , typeName , target )
1108+ spec , module , err := findTargetInModule (typeName , target , cache )
11131109 if err != nil {
11141110 return nil , nil , fmt .Errorf ("find target in modules: %w" , err )
11151111 }
@@ -1127,7 +1123,7 @@ func findTargetInKernel(kernelSpec *btf.Spec, typeName string, target *btf.Type)
11271123// are searched in the order they were loaded.
11281124//
11291125// 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 ) {
11311127 it := new (btf.HandleIterator )
11321128 defer it .Handle .Close ()
11331129
@@ -1141,7 +1137,7 @@ func findTargetInModule(base *btf.Spec, typeName string, target *btf.Type) (*btf
11411137 continue
11421138 }
11431139
1144- spec , err := it . Handle . Spec ( base )
1140+ spec , err := cache . Module ( info . Name )
11451141 if err != nil {
11461142 return nil , nil , fmt .Errorf ("parse types for module %s: %w" , info .Name , err )
11471143 }
@@ -1201,12 +1197,3 @@ func findTargetInProgram(prog *Program, name string, progType ProgramType, attac
12011197
12021198 return spec .TypeID (targetFunc )
12031199}
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