func()

in pkg/tools/ssl/gotls.go [78:120]


func (r *Register) GoTLS(symbolAddrMap *ebpf.Map, write, writeRet, read, readRet *ebpf.Program) {
	r.addHandler("goTLS", func() (bool, error) {
		buildVersionSymbol := r.searchSymbolInModules(r.modules, func(a, b string) bool {
			return a == b
		}, "runtime.buildVersion")
		if buildVersionSymbol == nil {
			return false, nil
		}
		pidExeFile := host.GetFileInHost(fmt.Sprintf("/proc/%d/exe", r.pid))
		elfFile, err := elf.NewFile(pidExeFile)
		if err != nil {
			return false, fmt.Errorf("read executable file error: %v", err)
		}
		defer elfFile.Close()

		v, err := r.getGoVersion(elfFile, buildVersionSymbol)
		if err != nil {
			return false, err
		}

		offsets, err := r.generateGOTLSSymbolOffsets(r, elfFile, v)
		if err != nil {
			return false, err
		}
		if offsets == nil {
			return false, nil
		}

		// setting the locations
		if err := symbolAddrMap.Put(uint32(r.pid), offsets); err != nil {
			return false, fmt.Errorf("setting the Go TLS argument location failure, pid: %d, error: %v", r.pid, err)
		}

		exeFile := r.linker.OpenUProbeExeFile(pidExeFile)
		exeFile.AddGoLink(goTLSWriteSymbol, write, writeRet, elfFile)
		exeFile.AddGoLink(goTLSReadSymbol, read, readRet, elfFile)
		if e := r.linker.HasError(); e != nil {
			return false, e
		}

		return true, nil
	})
}