aboutsummaryrefslogtreecommitdiff
path: root/src/debug
diff options
context:
space:
mode:
Diffstat (limited to 'src/debug')
-rw-r--r--src/debug/elf/file.go34
1 files changed, 30 insertions, 4 deletions
diff --git a/src/debug/elf/file.go b/src/debug/elf/file.go
index 8c84661c5f..e93200a11d 100644
--- a/src/debug/elf/file.go
+++ b/src/debug/elf/file.go
@@ -1150,11 +1150,37 @@ func (f *File) DWARF() (*dwarf.Data, error) {
if err != nil && uint64(len(b)) < s.Size {
return nil, err
}
-
+ var (
+ dlen uint64
+ dbuf []byte
+ )
if len(b) >= 12 && string(b[:4]) == "ZLIB" {
- dlen := binary.BigEndian.Uint64(b[4:12])
- dbuf := make([]byte, dlen)
- r, err := zlib.NewReader(bytes.NewBuffer(b[12:]))
+ dlen = binary.BigEndian.Uint64(b[4:12])
+ s.compressionOffset = 12
+ }
+ if dlen == 0 && len(b) >= 12 && s.Flags&SHF_COMPRESSED != 0 &&
+ s.Flags&SHF_ALLOC == 0 &&
+ f.FileHeader.ByteOrder.Uint32(b[:]) == uint32(COMPRESS_ZLIB) {
+ s.compressionType = COMPRESS_ZLIB
+ switch f.FileHeader.Class {
+ case ELFCLASS32:
+ // Chdr32.Size offset
+ dlen = uint64(f.FileHeader.ByteOrder.Uint32(b[4:]))
+ s.compressionOffset = 12
+ case ELFCLASS64:
+ if len(b) < 24 {
+ return nil, errors.New("invalid compress header 64")
+ }
+ // Chdr64.Size offset
+ dlen = f.FileHeader.ByteOrder.Uint64(b[8:])
+ s.compressionOffset = 24
+ default:
+ return nil, fmt.Errorf("unsupported compress header:%s", f.FileHeader.Class)
+ }
+ }
+ if dlen > 0 {
+ dbuf = make([]byte, dlen)
+ r, err := zlib.NewReader(bytes.NewBuffer(b[s.compressionOffset:]))
if err != nil {
return nil, err
}