mirror of
https://github.com/golang/go.git
synced 2025-12-08 06:10:04 +00:00
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>
This commit is contained in:
parent
53d859bdf5
commit
ed2fce2d87
1 changed files with 19 additions and 5 deletions
|
|
@ -1391,13 +1391,22 @@ func writeframes(ctxt *Link, syms []*sym.Symbol) []*sym.Symbol {
|
||||||
fs.Type = sym.SDWARFSECT
|
fs.Type = sym.SDWARFSECT
|
||||||
syms = append(syms, fs)
|
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
|
// Emit the CIE, Section 6.4.1
|
||||||
cieReserve := uint32(16)
|
cieReserve := uint32(16)
|
||||||
if haslinkregister(ctxt) {
|
if haslinkregister(ctxt) {
|
||||||
cieReserve = 32
|
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
|
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(3) // dwarf version (appendix F)
|
||||||
fs.AddUint8(0) // augmentation ""
|
fs.AddUint8(0) // augmentation ""
|
||||||
dwarf.Uleb128put(dwarfctxt, fs, 1) // code_alignment_factor
|
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)].
|
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) + lengthFieldSize - fs.Size
|
||||||
pad := int64(cieReserve) + 4 - fs.Size
|
|
||||||
|
|
||||||
if pad < 0 {
|
if pad < 0 {
|
||||||
Exitf("dwarf: cieReserve too small by %d bytes.", -pad)
|
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.
|
// Emit the FDE header, Section 6.4.1.
|
||||||
// 4 bytes: length, must be multiple of thearch.ptrsize
|
// 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: initial location
|
||||||
// ptrsize: address range
|
// 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 {
|
if ctxt.LinkMode == LinkExternal {
|
||||||
addDwarfAddrRef(ctxt, fs, fs)
|
addDwarfAddrRef(ctxt, fs, fs)
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue