github.com/Rookout/GoSDK@v0.1.48/pkg/services/instrumentation/dwarf/godwarf/addr.go (about)

     1  // The MIT License (MIT)
     2  
     3  // Copyright (c) 2014 Derek Parker
     4  
     5  // Permission is hereby granted, free of charge, to any person obtaining a copy of
     6  // this software and associated documentation files (the "Software"), to deal in
     7  // the Software without restriction, including without limitation the rights to
     8  // use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
     9  // the Software, and to permit persons to whom the Software is furnished to do so,
    10  // subject to the following conditions:
    11  
    12  // The above copyright notice and this permission notice shall be included in all
    13  // copies or substantial portions of the Software.
    14  
    15  // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
    16  // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
    17  // FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
    18  // COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
    19  // IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
    20  // CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
    21  
    22  package godwarf
    23  
    24  import (
    25  	"bytes"
    26  	"encoding/binary"
    27  	"errors"
    28  
    29  	"github.com/Rookout/GoSDK/pkg/services/instrumentation/dwarf/util"
    30  )
    31  
    32  
    33  
    34  type DebugAddrSection struct {
    35  	byteOrder binary.ByteOrder
    36  	ptrSz     int
    37  	data      []byte
    38  }
    39  
    40  
    41  func ParseAddr(data []byte) *DebugAddrSection {
    42  	if len(data) == 0 {
    43  		return nil
    44  	}
    45  	r := &DebugAddrSection{data: data}
    46  	_, dwarf64, _, byteOrder := util.ReadDwarfLengthVersion(data)
    47  	r.byteOrder = byteOrder
    48  	data = data[6:]
    49  	if dwarf64 {
    50  		data = data[8:]
    51  	}
    52  
    53  	addrSz := data[0]
    54  	segSelSz := data[1]
    55  	r.ptrSz = int(addrSz + segSelSz)
    56  
    57  	return r
    58  }
    59  
    60  
    61  func (addr *DebugAddrSection) GetSubsection(addrBase uint64) *DebugAddr {
    62  	if addr == nil {
    63  		return nil
    64  	}
    65  	return &DebugAddr{DebugAddrSection: addr, addrBase: addrBase}
    66  }
    67  
    68  
    69  type DebugAddr struct {
    70  	*DebugAddrSection
    71  	addrBase uint64
    72  }
    73  
    74  
    75  func (addr *DebugAddr) Get(idx uint64) (uint64, error) {
    76  	if addr == nil || addr.DebugAddrSection == nil {
    77  		return 0, errors.New("debug_addr section not present")
    78  	}
    79  	off := idx*uint64(addr.ptrSz) + addr.addrBase
    80  	return util.ReadUintRaw(bytes.NewReader(addr.data[off:]), addr.byteOrder, addr.ptrSz)
    81  }