Skip to content
Snippets Groups Projects
loader.go 59.1 KiB
Newer Older
  • Learn to ignore specific revisions
  • 		if !dupok {
    			if s.Attr.OnList() {
    				log.Fatalf("symbol %s listed multiple times", s.Name)
    			}
    			s.Attr.Set(sym.AttrOnList, true)
    			lib.Textp = append(lib.Textp, s)
    
    			lib.Textp2 = append(lib.Textp2, sym.LoaderSym(isym))
    
    			// there may be a dup in another package
    
    			// put into a temp list and add to text later
    			lib.DupTextSyms = append(lib.DupTextSyms, s)
    
    			lib.DupTextSyms2 = append(lib.DupTextSyms2, sym.LoaderSym(isym))
    
    func patchDWARFName1(p []byte, r *oReader) ([]byte, int) {
    
    	// This is kind of ugly. Really the package name should not
    	// even be included here.
    
    	if len(p) < 1 || p[0] != dwarf.DW_ABRV_FUNCTION {
    		return p, -1
    
    	if !bytes.Contains(p[:e], emptyPkg) {
    		return p, -1
    
    	patched := bytes.Replace(p[:e], emptyPkg, pkgprefix, -1)
    	return append(patched, p[e:]...), e
    }
    
    func patchDWARFName(s *sym.Symbol, r *oReader) {
    	patched, e := patchDWARFName1(s.P, r)
    	if e == -1 {
    		return
    	}
    	s.P = patched
    
    	s.Attr.Set(sym.AttrReadOnly, false)
    	delta := int64(len(s.P)) - s.Size
    	s.Size = int64(len(s.P))
    	for i := range s.R {
    		r := &s.R[i]
    		if r.Off > int32(e) {
    			r.Off += int32(delta)
    		}
    	}
    }
    
    
    // For debugging.
    func (l *Loader) Dump() {
    	fmt.Println("objs")
    	for _, obj := range l.objs {
    		if obj.r != nil {
    			fmt.Println(obj.i, obj.r.unit.Lib)
    		}
    	}
    
    	fmt.Println("syms")
    	for i, s := range l.Syms {
    		if i == 0 {
    			continue
    		}
    		if s != nil {
    			fmt.Println(i, s, s.Type)
    		} else {
    			fmt.Println(i, l.SymName(Sym(i)), "<not loaded>")
    		}
    	}
    	fmt.Println("overwrite:", l.overwrite)
    	fmt.Println("symsByName")
    
    	for name, i := range l.symsByName[0] {
    		fmt.Println(i, name, 0)
    	}
    	for name, i := range l.symsByName[1] {
    		fmt.Println(i, name, 1)