diff options
Diffstat (limited to 'src/debug')
| -rw-r--r-- | src/debug/elf/file.go | 34 |
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 } |
