aboutsummaryrefslogtreecommitdiff
path: root/src/debug
diff options
context:
space:
mode:
authorMeng Zhuo <mzh@golangcn.org>2022-01-26 10:23:48 +0800
committermzh <mzh@golangcn.org>2022-03-16 05:32:52 +0000
commitd34287a4f68de5b8a796ec50b8c6b0582a4afc40 (patch)
tree9fd0e7642cffb8fab7acef76b2c95b24978f48af /src/debug
parent6e49c592de91fd7ea7d47aa50360a1c4f49172f8 (diff)
downloadgo-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.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
}