diff options
| author | Meng Zhuo <mzh@golangcn.org> | 2022-01-26 10:23:48 +0800 |
|---|---|---|
| committer | mzh <mzh@golangcn.org> | 2022-03-16 05:32:52 +0000 |
| commit | d34287a4f68de5b8a796ec50b8c6b0582a4afc40 (patch) | |
| tree | 9fd0e7642cffb8fab7acef76b2c95b24978f48af /src/debug | |
| parent | 6e49c592de91fd7ea7d47aa50360a1c4f49172f8 (diff) | |
| download | go-d34287a4f68de5b8a796ec50b8c6b0582a4afc40.tar.xz | |
cmd/link: default generic ABI compression for ELF
This CL change all debug dwarf headers to generic ABI
"Compression header" for ELF
(http://www.sco.com/developers/gabi/latest/ch4.sheader.html#compression_header)
Fixes #50796
Change-Id: I188625e596f11cd120dbd802ac2d79341d5eaf41
Reviewed-on: https://go-review.googlesource.com/c/go/+/380755
Trust: mzh <mzh@golangcn.org>
Run-TryBot: mzh <mzh@golangcn.org>
TryBot-Result: Gopher Robot <gobot@golang.org>
Reviewed-by: Than McIntosh <thanm@google.com>
Reviewed-by: Cherry Mui <cherryyz@google.com>
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 } |
