mirror of
				https://github.com/go-delve/delve.git
				synced 2025-10-31 10:47:27 +08:00 
			
		
		
		
	
		
			
				
	
	
		
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			61 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package godwarf
 | |
| 
 | |
| import (
 | |
| 	"bytes"
 | |
| 	"encoding/binary"
 | |
| 	"errors"
 | |
| 
 | |
| 	"github.com/go-delve/delve/pkg/dwarf"
 | |
| )
 | |
| 
 | |
| // DebugAddrSection represents the debug_addr section of DWARFv5.
 | |
| // See DWARFv5 section 7.27 page 241 and following.
 | |
| type DebugAddrSection struct {
 | |
| 	byteOrder binary.ByteOrder
 | |
| 	ptrSz     int
 | |
| 	data      []byte
 | |
| }
 | |
| 
 | |
| // ParseAddr parses the header of a debug_addr section.
 | |
| func ParseAddr(data []byte) *DebugAddrSection {
 | |
| 	if len(data) == 0 {
 | |
| 		return nil
 | |
| 	}
 | |
| 	r := &DebugAddrSection{data: data}
 | |
| 	_, dwarf64, _, byteOrder := dwarf.ReadDwarfLengthVersion(data)
 | |
| 	r.byteOrder = byteOrder
 | |
| 	data = data[6:]
 | |
| 	if dwarf64 {
 | |
| 		data = data[8:]
 | |
| 	}
 | |
| 
 | |
| 	addrSz := data[0]
 | |
| 	segSelSz := data[1]
 | |
| 	r.ptrSz = int(addrSz + segSelSz)
 | |
| 
 | |
| 	return r
 | |
| }
 | |
| 
 | |
| // GetSubsection returns the subsection of debug_addr starting at addrBase
 | |
| func (addr *DebugAddrSection) GetSubsection(addrBase uint64) *DebugAddr {
 | |
| 	if addr == nil {
 | |
| 		return nil
 | |
| 	}
 | |
| 	return &DebugAddr{DebugAddrSection: addr, addrBase: addrBase}
 | |
| }
 | |
| 
 | |
| // DebugAddr represents a subsection of the debug_addr section with a specific base address
 | |
| type DebugAddr struct {
 | |
| 	*DebugAddrSection
 | |
| 	addrBase uint64
 | |
| }
 | |
| 
 | |
| // Get returns the address at index idx starting from addrBase.
 | |
| func (addr *DebugAddr) Get(idx uint64) (uint64, error) {
 | |
| 	if addr == nil || addr.DebugAddrSection == nil {
 | |
| 		return 0, errors.New("debug_addr section not present")
 | |
| 	}
 | |
| 	off := idx*uint64(addr.ptrSz) + addr.addrBase
 | |
| 	return dwarf.ReadUintRaw(bytes.NewReader(addr.data[off:]), addr.byteOrder, addr.ptrSz)
 | |
| }
 | 
