diff options
| author | Clément Chigot <clement.chigot@atos.net> | 2019-01-07 10:22:42 +0100 |
|---|---|---|
| committer | Ian Lance Taylor <iant@golang.org> | 2019-03-06 05:24:22 +0000 |
| commit | ed2fce2d87ea9aae2e6fcc11610fb64f72e5377e (patch) | |
| tree | 807dc597c00bc43fdc39449430ed49ad1233f403 /src | |
| parent | 53d859bdf570699c7d581f6ba3cdc45d0ad102f3 (diff) | |
| download | go-ed2fce2d87ea9aae2e6fcc11610fb64f72e5377e.tar.xz | |
cmd/link: support dwarf64 when writing .debug_frame
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>
Diffstat (limited to 'src')
| -rw-r--r-- | src/cmd/link/internal/ld/dwarf.go | 24 |
1 files changed, 19 insertions, 5 deletions
diff --git a/src/cmd/link/internal/ld/dwarf.go b/src/cmd/link/internal/ld/dwarf.go index a150306df9..c226886557 100644 --- a/src/cmd/link/internal/ld/dwarf.go +++ b/src/cmd/link/internal/ld/dwarf.go @@ -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 { |
