| 1234567891011121314151617181920212223242526272829303132333435363738394041 |
- package tracer
- import (
- "fmt"
- "github.com/cilium/ebpf"
- "github.com/cilium/ebpf/asm"
- "os"
- "strconv"
- )
- func PidFilter(collectionSpec *ebpf.CollectionSpec) {
- ENV_PID := os.Getenv("FILTER_PID")
- if ENV_PID != "" {
- filterPid, _ := strconv.ParseInt(ENV_PID, 10, 64)
- type Editor struct {
- instructions *asm.Instructions
- ReferenceOffsets map[string][]int
- }
- for _, prog := range collectionSpec.Programs {
- fmt.Println("collectionSpec.Program:", prog.Name, prog.SectionName, prog.Type)
- insns := &prog.Instructions
- refs := insns.ReferenceOffsets()
- edit := &Editor{insns, refs}
- indices := edit.ReferenceOffsets["filter_pid"]
- //fmt.Println("len(indices):", len(indices))
- if len(indices) == 0 {
- continue
- }
- ldDWImm := asm.LoadImmOp(asm.DWord)
- for _, index := range indices {
- load := &(*edit.instructions)[index]
- if load.OpCode != ldDWImm {
- continue
- //return errors.Errorf("symbol %v: load: found %v instead of %v", symbol, load.OpCode, ldDWImm)
- }
- load.Constant = filterPid
- }
- }
- }
- }
|