Documentation ¶
Overview ¶
Package frame contains data structures and related functions for parsing and searching through Dwarf .debug_frame data.
Index ¶
Constants ¶
const ( DW_OP_addr = 0x03 DW_OP_const1s = 0x09 )
Operation opcodes
const ( DW_OP_const2u = 0x0a DW_OP_const2s = 0x0b DW_OP_const4u = iota DW_OP_const4s DW_OP_const8u DW_OP_const8s DW_OP_constu DW_OP_consts DW_OP_dup DW_OP_drop DW_OP_over DW_OP_pick DW_OP_swap DW_OP_rot DW_OP_xderef DW_OP_abs DW_OP_and DW_OP_div DW_OP_minus DW_OP_mod DW_OP_mul DW_OP_neg DW_OP_not DW_OP_or DW_OP_plus DW_OP_plus_uconst DW_OP_shl DW_OP_shr DW_OP_shra DW_OP_xor DW_OP_skip DW_OP_bra DW_OP_eq DW_OP_ge DW_OP_gt DW_OP_le DW_OP_lt DW_OP_ne )
const ( DW_OP_lit0 = 0x30 DW_OP_lit1 = 0x31 DW_OP_lit2 = iota DW_OP_lit3 DW_OP_lit4 DW_OP_lit5 DW_OP_lit6 DW_OP_lit7 DW_OP_lit8 DW_OP_lit9 DW_OP_lit10 DW_OP_lit11 DW_OP_lit12 DW_OP_lit13 DW_OP_lit14 DW_OP_lit15 DW_OP_lit16 DW_OP_lit17 DW_OP_lit18 DW_OP_lit19 DW_OP_lit20 DW_OP_lit21 DW_OP_lit22 DW_OP_lit23 DW_OP_lit24 DW_OP_lit25 DW_OP_lit26 DW_OP_lit27 DW_OP_lit28 DW_OP_lit29 DW_OP_lit30 DW_OP_lit31 DW_OP_reg0 DW_OP_reg1 DW_OP_reg2 DW_OP_reg3 DW_OP_reg4 DW_OP_reg5 DW_OP_reg6 DW_OP_reg7 DW_OP_reg8 DW_OP_reg9 DW_OP_reg10 DW_OP_reg11 DW_OP_reg12 DW_OP_reg13 DW_OP_reg14 DW_OP_reg15 DW_OP_reg16 DW_OP_reg17 DW_OP_reg18 DW_OP_reg19 DW_OP_reg20 DW_OP_reg21 DW_OP_reg22 DW_OP_reg23 DW_OP_reg24 DW_OP_reg25 DW_OP_reg26 DW_OP_reg27 DW_OP_reg28 DW_OP_reg29 DW_OP_reg30 DW_OP_reg31 DW_OP_breg0 DW_OP_breg1 DW_OP_breg2 DW_OP_breg3 DW_OP_breg4 DW_OP_breg5 DW_OP_breg6 DW_OP_breg7 DW_OP_breg8 DW_OP_breg9 DW_OP_breg10 DW_OP_breg11 DW_OP_breg12 DW_OP_breg13 DW_OP_breg14 DW_OP_breg15 DW_OP_breg16 DW_OP_breg17 DW_OP_breg18 DW_OP_breg19 DW_OP_breg20 DW_OP_breg21 DW_OP_breg22 DW_OP_breg23 DW_OP_breg24 DW_OP_breg25 DW_OP_breg26 DW_OP_breg27 DW_OP_breg28 DW_OP_breg29 DW_OP_breg30 DW_OP_breg31 DW_OP_regx DW_OP_fbreg DW_OP_bregx DW_OP_piece DW_OP_deref_size DW_OP_xderef_size DW_OP_nop DW_OP_push_object_address DW_OP_call2 DW_OP_call4 DW_OP_call_ref DW_OP_form_tls_address DW_OP_call_frame_cfa DW_OP_bit_piece DW_OP_lo_user = 0xe0 DW_OP_hi_user = 0xff )
const ( DW_CFA_nop = 0x0 // No ops DW_CFA_set_loc = 0x01 // op1: address DW_CFA_advance_loc1 = iota // op1: 1-bytes delta DW_CFA_advance_loc2 // op1: 2-byte delta DW_CFA_advance_loc4 // op1: 4-byte delta DW_CFA_offset_extended // op1: ULEB128 register, op2: ULEB128 offset DW_CFA_restore_extended // op1: ULEB128 register DW_CFA_undefined // op1: ULEB128 register DW_CFA_same_value // op1: ULEB128 register DW_CFA_register // op1: ULEB128 register, op2: ULEB128 register DW_CFA_remember_state // No ops DW_CFA_restore_state // No ops DW_CFA_def_cfa // op1: ULEB128 register, op2: ULEB128 offset DW_CFA_def_cfa_register // op1: ULEB128 register DW_CFA_def_cfa_offset // op1: ULEB128 offset DW_CFA_def_cfa_expression // op1: BLOCK DW_CFA_expression // op1: ULEB128 register, op2: BLOCK DW_CFA_offset_extended_sf // op1: ULEB128 register, op2: SLEB128 BLOCK DW_CFA_def_cfa_sf // op1: ULEB128 register, op2: SLEB128 offset DW_CFA_def_cfa_offset_sf // op1: SLEB128 offset DW_CFA_val_offset // op1: ULEB128, op2: ULEB128 DW_CFA_val_offset_sf // op1: ULEB128, op2: SLEB128 DW_CFA_val_expression // op1: ULEB128, op2: BLOCK DW_CFA_lo_user = 0x1c // op1: BLOCK DW_CFA_hi_user = 0x3f // op1: ULEB128 register, op2: BLOCK DW_CFA_advance_loc = (0x1 << 6) // High 2 bits: 0x1, low 6: delta DW_CFA_offset = (0x2 << 6) // High 2 bits: 0x2, low 6: register DW_CFA_restore = (0x3 << 6) // High 2 bits: 0x3, low 6: register )
Instructions used to recreate the table from the .debug_frame data.
Variables ¶
This section is empty.
Functions ¶
func DwarfEndian ¶
DwarfEndian determines the endianness of the DWARF by using the version number field in the debug_info section Trick borrowed from "debug/dwarf".New()
Types ¶
type CommonInformationEntry ¶
type CommonInformationEntry struct { Length uint32 CIE_id uint32 Version uint8 Augmentation string CodeAlignmentFactor uint64 DataAlignmentFactor int64 ReturnAddressRegister uint64 InitialInstructions []byte // contains filtered or unexported fields }
CommonInformationEntry represents a Common Information Entry in the Dwarf .debug_frame section.
type ErrNoFDEForPC ¶ added in v1.2.0
type ErrNoFDEForPC struct {
PC uint64
}
ErrNoFDEForPC FDE for PC not found error
func (*ErrNoFDEForPC) Error ¶ added in v1.2.0
func (err *ErrNoFDEForPC) Error() string
type FrameContext ¶
type FrameContext struct { CFA DWRule Regs map[uint64]DWRule RetAddrReg uint64 // contains filtered or unexported fields }
FrameContext wrapper of FDE context
func (*FrameContext) ExecuteUntilPC ¶
func (frame *FrameContext) ExecuteUntilPC(instructions []byte)
ExecuteUntilPC execute dwarf instructions.
type FrameDescriptionEntries ¶
type FrameDescriptionEntries []*FrameDescriptionEntry
func Parse ¶
func Parse(data []byte, order binary.ByteOrder, staticBase uint64, ptrSize int, ehFrameAddr uint64) (FrameDescriptionEntries, error)
Parse takes in data (a byte slice) and returns FrameDescriptionEntries, which is a slice of FrameDescriptionEntry. Each FrameDescriptionEntry has a pointer to CommonInformationEntry. If ehFrameAddr is not zero the .eh_frame format will be used, a minor variant of DWARF described at https://www.airs.com/blog/archives/460. The value of ehFrameAddr will be used as the address at which eh_frame will be mapped into memory
func (FrameDescriptionEntries) Append ¶ added in v1.3.0
func (fdes FrameDescriptionEntries) Append(otherFDEs FrameDescriptionEntries) FrameDescriptionEntries
Append appends otherFDEs to fdes and returns the result.
func (FrameDescriptionEntries) FDEForPC ¶
func (fdes FrameDescriptionEntries) FDEForPC(pc uint64) (*FrameDescriptionEntry, error)
FDEForPC returns the Frame Description Entry for the given PC.
type FrameDescriptionEntry ¶
type FrameDescriptionEntry struct { Length uint32 CIE *CommonInformationEntry Instructions []byte // contains filtered or unexported fields }
FrameDescriptionEntry represents a Frame Descriptor Entry in the Dwarf .debug_frame section.
func (*FrameDescriptionEntry) Begin ¶
func (fde *FrameDescriptionEntry) Begin() uint64
Begin returns address of first location for this frame.
func (*FrameDescriptionEntry) Cover ¶
func (fde *FrameDescriptionEntry) Cover(addr uint64) bool
Cover returns whether or not the given address is within the bounds of this frame.
func (*FrameDescriptionEntry) End ¶
func (fde *FrameDescriptionEntry) End() uint64
End returns address of last location for this frame.
func (*FrameDescriptionEntry) EstablishFrame ¶
func (fde *FrameDescriptionEntry) EstablishFrame(pc uint64) *FrameContext
EstablishFrame set up frame for the given PC.
func (*FrameDescriptionEntry) Translate ¶ added in v1.6.1
func (fde *FrameDescriptionEntry) Translate(delta uint64)
Translate moves the beginning of fde forward by delta.
type Rule ¶ added in v1.0.0
type Rule byte
Rule rule defined for register values.
const ( RuleUndefined Rule = iota RuleSameVal RuleOffset RuleValOffset RuleRegister RuleExpression RuleValExpression RuleArchitectural RuleCFA // Value is rule.Reg + rule.Offset RuleFramePointer // Value is stored at address rule.Reg + rule.Offset, but only if it's less than the current CFA, otherwise same value )