dwarf/frame: discard indirect flag reading personality func in eh_frame (#3032)
We don't do anything with the personality function so there is no point in complaining that we don't fully support the pointer encoding flags used to describe it. This matches the current level of support of pointer encodings in gdb (they are discarded when reading the personality function and not supported for FDEs because gcc doesn't generate them). Fixes #3015
This commit is contained in:
parent
76ecc53293
commit
2d09ea65bc
@ -108,8 +108,8 @@ func (fdes FrameDescriptionEntries) Append(otherFDEs FrameDescriptionEntries) Fr
|
||||
// ptrEnc represents a pointer encoding value, used during eh_frame decoding
|
||||
// to determine how pointers were encoded.
|
||||
// Least significant 4 (0xf) bytes encode the size as well as its
|
||||
// signed-ness, most significant 4 bytes (0xf0) are flags describing how
|
||||
// the value should be interpreted (absolute, relative...)
|
||||
// signed-ness, most significant 4 bytes (0xf0 == ptrEncFlagsMask) are flags
|
||||
// describing how the value should be interpreted (absolute, relative...)
|
||||
// See https://www.airs.com/blog/archives/460.
|
||||
type ptrEnc uint8
|
||||
|
||||
@ -126,12 +126,16 @@ const (
|
||||
ptrEncSdata4 ptrEnc = 0x0b // 4 bytes, signed
|
||||
ptrEncSdata8 ptrEnc = 0x0c // 8 bytes, signed
|
||||
|
||||
ptrEncFlagsMask ptrEnc = 0xf0
|
||||
|
||||
ptrEncPCRel ptrEnc = 0x10 // value is relative to the memory address where it appears
|
||||
ptrEncTextRel ptrEnc = 0x20 // value is relative to the address of the text section
|
||||
ptrEncDataRel ptrEnc = 0x30 // value is relative to the address of the data section
|
||||
ptrEncFuncRel ptrEnc = 0x40 // value is relative to the start of the function
|
||||
ptrEncAligned ptrEnc = 0x50 // value should be aligned
|
||||
ptrEncIndirect ptrEnc = 0x80 // value is an address where the real value of the pointer is stored
|
||||
|
||||
ptrEncSupportedFlags = ptrEncPCRel
|
||||
)
|
||||
|
||||
// Supported returns true if this pointer encoding is supported.
|
||||
@ -142,7 +146,7 @@ func (ptrEnc ptrEnc) Supported() bool {
|
||||
// These values aren't defined at the moment
|
||||
return false
|
||||
}
|
||||
if ptrEnc&0xf0 != ptrEncPCRel {
|
||||
if (ptrEnc&ptrEncFlagsMask)&^ptrEncSupportedFlags != 0 {
|
||||
// Currently only the PC relative flag is supported
|
||||
return false
|
||||
}
|
||||
|
||||
@ -201,12 +201,13 @@ func parseCIE(ctx *parseContext) parsefunc {
|
||||
// the pointer to the personality function encoded as specified by the
|
||||
// pointer encoding.
|
||||
// We don't support this but have to read it anyway.
|
||||
e, _ := buf.ReadByte()
|
||||
if !ptrEnc(e).Supported() {
|
||||
b, _ := buf.ReadByte()
|
||||
e := ptrEnc(b) &^ ptrEncIndirect
|
||||
if !e.Supported() {
|
||||
ctx.err = fmt.Errorf("pointer encoding not supported %#x at %#x", e, ctx.offset())
|
||||
return nil
|
||||
}
|
||||
ctx.readEncodedPtr(0, buf, ptrEnc(e))
|
||||
ctx.readEncodedPtr(0, buf, e)
|
||||
default:
|
||||
ctx.err = fmt.Errorf("unsupported augmentation character %c at %#x", ctx.common.Augmentation[i], ctx.offset())
|
||||
return nil
|
||||
|
||||
Loading…
Reference in New Issue
Block a user