filter.go 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041
  1. package tracer
  2. import (
  3. "fmt"
  4. "github.com/cilium/ebpf"
  5. "github.com/cilium/ebpf/asm"
  6. "os"
  7. "strconv"
  8. )
  9. func PidFilter(collectionSpec *ebpf.CollectionSpec) {
  10. ENV_PID := os.Getenv("FILTER_PID")
  11. if ENV_PID != "" {
  12. filterPid, _ := strconv.ParseInt(ENV_PID, 10, 64)
  13. type Editor struct {
  14. instructions *asm.Instructions
  15. ReferenceOffsets map[string][]int
  16. }
  17. for _, prog := range collectionSpec.Programs {
  18. fmt.Println("collectionSpec.Program:", prog.Name, prog.SectionName, prog.Type)
  19. insns := &prog.Instructions
  20. refs := insns.ReferenceOffsets()
  21. edit := &Editor{insns, refs}
  22. indices := edit.ReferenceOffsets["filter_pid"]
  23. //fmt.Println("len(indices):", len(indices))
  24. if len(indices) == 0 {
  25. continue
  26. }
  27. ldDWImm := asm.LoadImmOp(asm.DWord)
  28. for _, index := range indices {
  29. load := &(*edit.instructions)[index]
  30. if load.OpCode != ldDWImm {
  31. continue
  32. //return errors.Errorf("symbol %v: load: found %v instead of %v", symbol, load.OpCode, ldDWImm)
  33. }
  34. load.Constant = filterPid
  35. }
  36. }
  37. }
  38. }