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 }