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
})
}