mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-30 10:17:03 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			35 lines
		
	
	
		
			856 B
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			35 lines
		
	
	
		
			856 B
		
	
	
	
		
			Go
		
	
	
	
	
	
| package proc
 | |
| 
 | |
| import (
 | |
| 	"debug/elf"
 | |
| 	"debug/gosym"
 | |
| 	"fmt"
 | |
| )
 | |
| 
 | |
| func readPcLnTableElf(exe *elf.File, path string) (*gosym.Table, error) {
 | |
| 	// Default section label is .gopclntab
 | |
| 	sectionLabel := ".gopclntab"
 | |
| 
 | |
| 	section := exe.Section(sectionLabel)
 | |
| 	if section == nil {
 | |
| 		// binary may be built with -pie
 | |
| 		sectionLabel = ".data.rel.ro.gopclntab"
 | |
| 		section = exe.Section(sectionLabel)
 | |
| 		if section == nil {
 | |
| 			return nil, fmt.Errorf("could not read section .gopclntab")
 | |
| 		}
 | |
| 	}
 | |
| 	tableData, err := section.Data()
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("found section but could not read .gopclntab")
 | |
| 	}
 | |
| 
 | |
| 	addr := exe.Section(".text").Addr
 | |
| 	lineTable := gosym.NewLineTable(tableData, addr)
 | |
| 	symTable, err := gosym.NewTable([]byte{}, lineTable)
 | |
| 	if err != nil {
 | |
| 		return nil, fmt.Errorf("could not create symbol table from  %s ", path)
 | |
| 	}
 | |
| 	return symTable, nil
 | |
| }
 | 
