]> Cypherpunks repositories - gostls13.git/commitdiff
cmd/link: support dwarf64 when writing .debug_frame
authorClément Chigot <clement.chigot@atos.net>
Mon, 7 Jan 2019 09:22:42 +0000 (10:22 +0100)
committerIan Lance Taylor <iant@golang.org>
Wed, 6 Mar 2019 05:24:22 +0000 (05:24 +0000)
Fixes #28558

Change-Id: I0ecd9c47fb017cf4bd44725a83a0016c7bb94633
Reviewed-on: https://go-review.googlesource.com/c/go/+/156478
Run-TryBot: Ian Lance Taylor <iant@golang.org>
TryBot-Result: Gobot Gobot <gobot@golang.org>
Reviewed-by: Ian Lance Taylor <iant@golang.org>
src/cmd/link/internal/ld/dwarf.go

index a150306df9174dc8dd9f9ddf18cb62254d673baf..c226886557cd13b1d67584b130cb6894e0871590 100644 (file)
@@ -1391,13 +1391,22 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol {
        fs.Type = sym.SDWARFSECT
        syms = append(syms, fs)
 
+       // Length field is 4 bytes on Dwarf32 and 12 bytes on Dwarf64
+       lengthFieldSize := int64(4)
+       if isDwarf64(ctxt) {
+               lengthFieldSize += 8
+       }
+
        // Emit the CIE, Section 6.4.1
        cieReserve := uint32(16)
        if haslinkregister(ctxt) {
                cieReserve = 32
        }
+       if isDwarf64(ctxt) {
+               cieReserve += 4 // 4 bytes added for cid
+       }
        createUnitLength(ctxt, fs, uint64(cieReserve))             // initial length, must be multiple of thearch.ptrsize
-       addDwarfAddrField(ctxt, fs, 0xffffffff)                    // cid.
+       addDwarfAddrField(ctxt, fs, ^uint64(0))                    // cid
        fs.AddUint8(3)                                             // dwarf version (appendix F)
        fs.AddUint8(0)                                             // augmentation ""
        dwarf.Uleb128put(dwarfctxt, fs, 1)                         // code_alignment_factor
@@ -1423,8 +1432,7 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol {
                dwarf.Uleb128put(dwarfctxt, fs, int64(-ctxt.Arch.PtrSize)/dataAlignmentFactor) // ...is saved at [CFA - (PtrSize/4)].
        }
 
-       // 4 is to exclude the length field.
-       pad := int64(cieReserve) + 4 - fs.Size
+       pad := int64(cieReserve) + lengthFieldSize - fs.Size
 
        if pad < 0 {
                Exitf("dwarf: cieReserve too small by %d bytes.", -pad)
@@ -1480,10 +1488,16 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol {
 
                // Emit the FDE header, Section 6.4.1.
                //      4 bytes: length, must be multiple of thearch.ptrsize
-               //      4 bytes: Pointer to the CIE above, at offset 0
+               //      4/8 bytes: Pointer to the CIE above, at offset 0
                //      ptrsize: initial location
                //      ptrsize: address range
-               fs.AddUint32(ctxt.Arch, uint32(4+2*ctxt.Arch.PtrSize+len(deltaBuf))) // length (excludes itself)
+
+               fdeLength := uint64(4 + 2*ctxt.Arch.PtrSize + len(deltaBuf))
+               if isDwarf64(ctxt) {
+                       fdeLength += 4 // 4 bytes added for CIE pointer
+               }
+               createUnitLength(ctxt, fs, fdeLength)
+
                if ctxt.LinkMode == LinkExternal {
                        addDwarfAddrRef(ctxt, fs, fs)
                } else {