package dwarf
import (
"sort"
"strconv"
)
type unit struct {
base Offset
off Offset
data []byte
atable abbrevTable
asize int
vers int
utype uint8
is64 bool
}
func (u *unit ) version () int {
return u .vers
}
func (u *unit ) dwarf64 () (bool , bool ) {
return u .is64 , true
}
func (u *unit ) addrsize () int {
return u .asize
}
func (d *Data ) parseUnits () ([]unit , error ) {
nunit := 0
b := makeBuf (d , unknownFormat {}, "info" , 0 , d .info )
for len (b .data ) > 0 {
len , _ := b .unitLength ()
if len != Offset (uint32 (len )) {
b .error ("unit length overflow" )
break
}
b .skip (int (len ))
if len > 0 {
nunit ++
}
}
if b .err != nil {
return nil , b .err
}
b = makeBuf (d , unknownFormat {}, "info" , 0 , d .info )
units := make ([]unit , nunit )
for i := range units {
u := &units [i ]
u .base = b .off
var n Offset
if b .err != nil {
return nil , b .err
}
for n == 0 {
n , u .is64 = b .unitLength ()
}
dataOff := b .off
vers := b .uint16 ()
if vers < 2 || vers > 5 {
b .error ("unsupported DWARF version " + strconv .Itoa (int (vers )))
break
}
u .vers = int (vers )
if vers >= 5 {
u .utype = b .uint8 ()
u .asize = int (b .uint8 ())
}
var abbrevOff uint64
if u .is64 {
abbrevOff = b .uint64 ()
} else {
abbrevOff = uint64 (b .uint32 ())
}
atable , err := d .parseAbbrev (abbrevOff , u .vers )
if err != nil {
if b .err == nil {
b .err = err
}
break
}
u .atable = atable
if vers < 5 {
u .asize = int (b .uint8 ())
}
switch u .utype {
case utSkeleton , utSplitCompile :
b .uint64 ()
case utType , utSplitType :
b .uint64 ()
if u .is64 {
b .uint64 ()
} else {
b .uint32 ()
}
}
u .off = b .off
u .data = b .bytes (int (n - (b .off - dataOff )))
}
if b .err != nil {
return nil , b .err
}
return units , nil
}
func (d *Data ) offsetToUnit (off Offset ) int {
next := sort .Search (len (d .unit ), func (i int ) bool {
return d .unit [i ].off > off
})
if next == 0 {
return -1
}
u := &d .unit [next -1 ]
if u .off <= off && off < u .off +Offset (len (u .data )) {
return next - 1
}
return -1
}
The pages are generated with Golds v0.7.0-preview . (GOOS=linux GOARCH=amd64)
Golds is a Go 101 project developed by Tapir Liu .
PR and bug reports are welcome and can be submitted to the issue list .
Please follow @zigo_101 (reachable from the left QR code) to get the latest news of Golds .