code: func symbolsFromBinaries(prof *profile.Profile, g *graph.Graph, rx *regexp.Regexp, address *uint64, obj plugin.ObjTool) []*objSymbol {
  	hasSamples := make(map[string]bool)
  	// Only examine mappings that have samples that match the
  	// regexp. This is an optimization to speed up pprof.
  	for _, n := range g.Nodes {
  		if name := n.Info.PrintableName(); rx.MatchString(name) && n.Info.Objfile != "" {
  			hasSamples[n.Info.Objfile] = true
  		}
  	}
  
  	// Walk all mappings looking for matching functions with samples.
  	var objSyms []*objSymbol
  	for _, m := range prof.Mapping {
  		if !hasSamples[m.File] {
  			if address == nil || !(m.Start <= *address && *address <= m.Limit) {
  				continue
  			}
  		}
  
  		f, err := obj.Open(m.File, m.Start, m.Limit, m.Offset)
  		if err != nil {
  			fmt.Printf("%v\n", err)
  			continue
  		}
  
  		// Find symbols in this binary matching the user regexp.
  		var addr uint64
  		if address != nil {
  			addr = *address
  		}
  		msyms, err := f.Symbols(rx, addr)
  		base := f.Base()
  		f.Close()
  		if err != nil {
  			continue
  		}
  		for _, ms := range msyms {
  			objSyms = append(objSyms,
  				&objSymbol{
  					sym:  ms,
  					base: base,
  					file: f,
  				},
  			)
  		}
  	}
  
  	return objSyms
  }
docs: // symbolsFromBinaries examines the binaries listed on the profile
  // that have associated samples, and identifies symbols matching rx.