go.mod: runc v1.0.1
Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
This commit is contained in:
		
							
								
								
									
										43
									
								
								vendor/github.com/cilium/ebpf/link/iter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										43
									
								
								vendor/github.com/cilium/ebpf/link/iter.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -3,8 +3,10 @@ package link
 | 
			
		||||
import (
 | 
			
		||||
	"fmt"
 | 
			
		||||
	"io"
 | 
			
		||||
	"unsafe"
 | 
			
		||||
 | 
			
		||||
	"github.com/cilium/ebpf"
 | 
			
		||||
	"github.com/cilium/ebpf/internal"
 | 
			
		||||
)
 | 
			
		||||
 | 
			
		||||
type IterOptions struct {
 | 
			
		||||
@@ -15,19 +17,45 @@ type IterOptions struct {
 | 
			
		||||
	// AttachTo requires the kernel to include BTF of itself,
 | 
			
		||||
	// and it to be compiled with a recent pahole (>= 1.16).
 | 
			
		||||
	Program *ebpf.Program
 | 
			
		||||
 | 
			
		||||
	// Map specifies the target map for bpf_map_elem and sockmap iterators.
 | 
			
		||||
	// It may be nil.
 | 
			
		||||
	Map *ebpf.Map
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// AttachIter attaches a BPF seq_file iterator.
 | 
			
		||||
func AttachIter(opts IterOptions) (*Iter, error) {
 | 
			
		||||
	link, err := AttachRawLink(RawLinkOptions{
 | 
			
		||||
		Program: opts.Program,
 | 
			
		||||
		Attach:  ebpf.AttachTraceIter,
 | 
			
		||||
	})
 | 
			
		||||
	if err := haveBPFLink(); err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	progFd := opts.Program.FD()
 | 
			
		||||
	if progFd < 0 {
 | 
			
		||||
		return nil, fmt.Errorf("invalid program: %s", internal.ErrClosedFd)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	var info bpfIterLinkInfoMap
 | 
			
		||||
	if opts.Map != nil {
 | 
			
		||||
		mapFd := opts.Map.FD()
 | 
			
		||||
		if mapFd < 0 {
 | 
			
		||||
			return nil, fmt.Errorf("invalid map: %w", internal.ErrClosedFd)
 | 
			
		||||
		}
 | 
			
		||||
		info.map_fd = uint32(mapFd)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	attr := bpfLinkCreateIterAttr{
 | 
			
		||||
		prog_fd:       uint32(progFd),
 | 
			
		||||
		attach_type:   ebpf.AttachTraceIter,
 | 
			
		||||
		iter_info:     internal.NewPointer(unsafe.Pointer(&info)),
 | 
			
		||||
		iter_info_len: uint32(unsafe.Sizeof(info)),
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	fd, err := bpfLinkCreateIter(&attr)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("can't link iterator: %w", err)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	return &Iter{*link}, err
 | 
			
		||||
	return &Iter{RawLink{fd, ""}}, err
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// LoadPinnedIter loads a pinned iterator from a bpffs.
 | 
			
		||||
@@ -65,3 +93,8 @@ func (it *Iter) Open() (io.ReadCloser, error) {
 | 
			
		||||
 | 
			
		||||
	return fd.File("bpf_iter"), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// union bpf_iter_link_info.map
 | 
			
		||||
type bpfIterLinkInfoMap struct {
 | 
			
		||||
	map_fd uint32
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										17
									
								
								vendor/github.com/cilium/ebpf/link/syscalls.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										17
									
								
								vendor/github.com/cilium/ebpf/link/syscalls.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -102,6 +102,23 @@ func bpfLinkCreate(attr *bpfLinkCreateAttr) (*internal.FD, error) {
 | 
			
		||||
	return internal.NewFD(uint32(ptr)), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type bpfLinkCreateIterAttr struct {
 | 
			
		||||
	prog_fd       uint32
 | 
			
		||||
	target_fd     uint32
 | 
			
		||||
	attach_type   ebpf.AttachType
 | 
			
		||||
	flags         uint32
 | 
			
		||||
	iter_info     internal.Pointer
 | 
			
		||||
	iter_info_len uint32
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func bpfLinkCreateIter(attr *bpfLinkCreateIterAttr) (*internal.FD, error) {
 | 
			
		||||
	ptr, err := internal.BPF(internal.BPF_LINK_CREATE, unsafe.Pointer(attr), unsafe.Sizeof(*attr))
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
	return internal.NewFD(uint32(ptr)), nil
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
type bpfLinkUpdateAttr struct {
 | 
			
		||||
	linkFd    uint32
 | 
			
		||||
	newProgFd uint32
 | 
			
		||||
 
 | 
			
		||||
							
								
								
									
										66
									
								
								vendor/github.com/cilium/ebpf/link/uprobe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										66
									
								
								vendor/github.com/cilium/ebpf/link/uprobe.go
									
									
									
										generated
									
									
										vendored
									
									
								
							@@ -35,6 +35,14 @@ type Executable struct {
 | 
			
		||||
	symbols map[string]elf.Symbol
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// UprobeOptions defines additional parameters that will be used
 | 
			
		||||
// when loading Uprobes.
 | 
			
		||||
type UprobeOptions struct {
 | 
			
		||||
	// Symbol offset. Must be provided in case of external symbols (shared libs).
 | 
			
		||||
	// If set, overrides the offset eventually parsed from the executable.
 | 
			
		||||
	Offset uint64
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// To open a new Executable, use:
 | 
			
		||||
//
 | 
			
		||||
//	OpenExecutable("/bin/bash")
 | 
			
		||||
@@ -78,6 +86,10 @@ func (ex *Executable) addSymbols(f func() ([]elf.Symbol, error)) error {
 | 
			
		||||
		return err
 | 
			
		||||
	}
 | 
			
		||||
	for _, s := range syms {
 | 
			
		||||
		if elf.ST_TYPE(s.Info) != elf.STT_FUNC {
 | 
			
		||||
			// Symbol not associated with a function or other executable code.
 | 
			
		||||
			continue
 | 
			
		||||
		}
 | 
			
		||||
		ex.symbols[s.Name] = s
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
@@ -95,13 +107,18 @@ func (ex *Executable) symbol(symbol string) (*elf.Symbol, error) {
 | 
			
		||||
// For example, /bin/bash::main():
 | 
			
		||||
//
 | 
			
		||||
//  ex, _ = OpenExecutable("/bin/bash")
 | 
			
		||||
//  ex.Uprobe("main", prog)
 | 
			
		||||
//  ex.Uprobe("main", prog, nil)
 | 
			
		||||
//
 | 
			
		||||
// When using symbols which belongs to shared libraries,
 | 
			
		||||
// an offset must be provided via options:
 | 
			
		||||
//
 | 
			
		||||
//  ex.Uprobe("main", prog, &UprobeOptions{Offset: 0x123})
 | 
			
		||||
//
 | 
			
		||||
// The resulting Link must be Closed during program shutdown to avoid leaking
 | 
			
		||||
// system resources. Functions provided by shared libraries can currently not
 | 
			
		||||
// be traced and will result in an ErrNotSupported.
 | 
			
		||||
func (ex *Executable) Uprobe(symbol string, prog *ebpf.Program) (Link, error) {
 | 
			
		||||
	u, err := ex.uprobe(symbol, prog, false)
 | 
			
		||||
func (ex *Executable) Uprobe(symbol string, prog *ebpf.Program, opts *UprobeOptions) (Link, error) {
 | 
			
		||||
	u, err := ex.uprobe(symbol, prog, opts, false)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -119,13 +136,18 @@ func (ex *Executable) Uprobe(symbol string, prog *ebpf.Program) (Link, error) {
 | 
			
		||||
// before the given symbol exits. For example, /bin/bash::main():
 | 
			
		||||
//
 | 
			
		||||
//  ex, _ = OpenExecutable("/bin/bash")
 | 
			
		||||
//  ex.Uretprobe("main", prog)
 | 
			
		||||
//  ex.Uretprobe("main", prog, nil)
 | 
			
		||||
//
 | 
			
		||||
// When using symbols which belongs to shared libraries,
 | 
			
		||||
// an offset must be provided via options:
 | 
			
		||||
//
 | 
			
		||||
//  ex.Uretprobe("main", prog, &UprobeOptions{Offset: 0x123})
 | 
			
		||||
//
 | 
			
		||||
// The resulting Link must be Closed during program shutdown to avoid leaking
 | 
			
		||||
// system resources. Functions provided by shared libraries can currently not
 | 
			
		||||
// be traced and will result in an ErrNotSupported.
 | 
			
		||||
func (ex *Executable) Uretprobe(symbol string, prog *ebpf.Program) (Link, error) {
 | 
			
		||||
	u, err := ex.uprobe(symbol, prog, true)
 | 
			
		||||
func (ex *Executable) Uretprobe(symbol string, prog *ebpf.Program, opts *UprobeOptions) (Link, error) {
 | 
			
		||||
	u, err := ex.uprobe(symbol, prog, opts, true)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, err
 | 
			
		||||
	}
 | 
			
		||||
@@ -141,7 +163,7 @@ func (ex *Executable) Uretprobe(symbol string, prog *ebpf.Program) (Link, error)
 | 
			
		||||
 | 
			
		||||
// uprobe opens a perf event for the given binary/symbol and attaches prog to it.
 | 
			
		||||
// If ret is true, create a uretprobe.
 | 
			
		||||
func (ex *Executable) uprobe(symbol string, prog *ebpf.Program, ret bool) (*perfEvent, error) {
 | 
			
		||||
func (ex *Executable) uprobe(symbol string, prog *ebpf.Program, opts *UprobeOptions, ret bool) (*perfEvent, error) {
 | 
			
		||||
	if prog == nil {
 | 
			
		||||
		return nil, fmt.Errorf("prog cannot be nil: %w", errInvalidInput)
 | 
			
		||||
	}
 | 
			
		||||
@@ -149,20 +171,28 @@ func (ex *Executable) uprobe(symbol string, prog *ebpf.Program, ret bool) (*perf
 | 
			
		||||
		return nil, fmt.Errorf("eBPF program type %s is not Kprobe: %w", prog.Type(), errInvalidInput)
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	sym, err := ex.symbol(symbol)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("symbol '%s' not found in '%s': %w", symbol, ex.path, err)
 | 
			
		||||
	}
 | 
			
		||||
	var offset uint64
 | 
			
		||||
	if opts != nil && opts.Offset != 0 {
 | 
			
		||||
		offset = opts.Offset
 | 
			
		||||
	} else {
 | 
			
		||||
		sym, err := ex.symbol(symbol)
 | 
			
		||||
		if err != nil {
 | 
			
		||||
			return nil, fmt.Errorf("symbol '%s' not found: %w", symbol, err)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
	// Symbols with location 0 from section undef are shared library calls and
 | 
			
		||||
	// are relocated before the binary is executed. Dynamic linking is not
 | 
			
		||||
	// implemented by the library, so mark this as unsupported for now.
 | 
			
		||||
	if sym.Section == elf.SHN_UNDEF && sym.Value == 0 {
 | 
			
		||||
		return nil, fmt.Errorf("cannot resolve %s library call '%s': %w", ex.path, symbol, ErrNotSupported)
 | 
			
		||||
		// Symbols with location 0 from section undef are shared library calls and
 | 
			
		||||
		// are relocated before the binary is executed. Dynamic linking is not
 | 
			
		||||
		// implemented by the library, so mark this as unsupported for now.
 | 
			
		||||
		if sym.Section == elf.SHN_UNDEF && sym.Value == 0 {
 | 
			
		||||
			return nil, fmt.Errorf("cannot resolve %s library call '%s', "+
 | 
			
		||||
				"consider providing the offset via options: %w", ex.path, symbol, ErrNotSupported)
 | 
			
		||||
		}
 | 
			
		||||
 | 
			
		||||
		offset = sym.Value
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Use uprobe PMU if the kernel has it available.
 | 
			
		||||
	tp, err := pmuUprobe(sym.Name, ex.path, sym.Value, ret)
 | 
			
		||||
	tp, err := pmuUprobe(symbol, ex.path, offset, ret)
 | 
			
		||||
	if err == nil {
 | 
			
		||||
		return tp, nil
 | 
			
		||||
	}
 | 
			
		||||
@@ -171,7 +201,7 @@ func (ex *Executable) uprobe(symbol string, prog *ebpf.Program, ret bool) (*perf
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	// Use tracefs if uprobe PMU is missing.
 | 
			
		||||
	tp, err = tracefsUprobe(uprobeSanitizedSymbol(sym.Name), ex.path, sym.Value, ret)
 | 
			
		||||
	tp, err = tracefsUprobe(uprobeSanitizedSymbol(symbol), ex.path, offset, ret)
 | 
			
		||||
	if err != nil {
 | 
			
		||||
		return nil, fmt.Errorf("creating trace event '%s:%s' in tracefs: %w", ex.path, symbol, err)
 | 
			
		||||
	}
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user