typedef struct Dwarf Dwarf; typedef struct DwarfAttrs DwarfAttrs; typedef struct DwarfBlock DwarfBlock; typedef struct DwarfBuf DwarfBuf; typedef struct DwarfExpr DwarfExpr; typedef struct DwarfSym DwarfSym; typedef union DwarfVal DwarfVal; enum { TagArrayType = 0x01, TagClassType = 0x02, TagEntryPoint = 0x03, TagEnumerationType = 0x04, TagFormalParameter = 0x05, TagImportedDeclaration = 0x08, TagLabel = 0x0A, TagLexDwarfBlock = 0x0B, TagMember = 0x0D, TagPointerType = 0x0F, TagReferenceType = 0x10, TagCompileUnit = 0x11, TagStringType = 0x12, TagStructType = 0x13, TagSubroutineType = 0x15, TagTypedef = 0x16, TagUnionType = 0x17, TagUnspecifiedParameters = 0x18, TagVariant = 0x19, TagCommonDwarfBlock = 0x1A, TagCommonInclusion = 0x1B, TagInheritance = 0x1C, TagInlinedSubroutine = 0x1D, TagModule = 0x1E, TagPtrToMemberType = 0x1F, TagSetType = 0x20, TagSubrangeType = 0x21, TagWithStmt = 0x22, TagAccessDeclaration = 0x23, TagBaseType = 0x24, TagCatchDwarfBlock = 0x25, TagConstType = 0x26, TagConstant = 0x27, TagEnumerator = 0x28, TagFileType = 0x29, TagFriend = 0x2A, TagNamelist = 0x2B, TagNamelistItem = 0x2C, TagPackedType = 0x2D, TagSubprogram = 0x2E, TagTemplateTypeParameter = 0x2F, TagTemplateValueParameter = 0x30, TagThrownType = 0x31, TagTryDwarfBlock = 0x32, TagVariantPart = 0x33, TagVariable = 0x34, TagVolatileType = 0x35, TagDwarfProcedure = 0x36, TagRestrictType = 0x37, TagInterfaceType = 0x38, TagNamespace = 0x39, TagImportedModule = 0x3A, TagUnspecifiedType = 0x3B, TagPartialUnit = 0x3C, TagImportedUnit = 0x3D, TagMutableType = 0x3E, TypeAddress = 0x01, TypeBoolean = 0x02, TypeComplexFloat = 0x03, TypeFloat = 0x04, TypeSigned = 0x05, TypeSignedChar = 0x06, TypeUnsigned = 0x07, TypeUnsignedChar = 0x08, TypeImaginaryFloat = 0x09, AccessPublic = 0x01, AccessProtected = 0x02, AccessPrivate = 0x03, VisLocal = 0x01, VisExported = 0x02, VisQualified = 0x03, VirtNone = 0x00, VirtVirtual = 0x01, VirtPureVirtual = 0x02, LangC89 = 0x0001, LangC = 0x0002, LangAda83 = 0x0003, LangCplusplus = 0x0004, LangCobol74 = 0x0005, LangCobol85 = 0x0006, LangFortran77 = 0x0007, LangFortran90 = 0x0008, LangPascal83 = 0x0009, LangModula2 = 0x000A, LangJava = 0x000B, LangC99 = 0x000C, LangAda95 = 0x000D, LangFortran95 = 0x000E, LangPLI = 0x000F, /* 0x8000-0xFFFF reserved */ IdCaseSensitive = 0x00, IdCaseUpper = 0x01, IdCaseLower = 0x02, IdCaseInsensitive = 0x03, CallingNormal = 0x01, CallingProgram = 0x02, CallingNocall = 0x03, /* 0x40-0xFF reserved */ InNone = 0x00, InInlined = 0x01, InDeclaredNotInlined = 0x02, InDeclaredInlined = 0x03, OrderRowMajor = 0x00, OrderColumnMajor = 0x01, DiscLabel = 0x00, DiscRange = 0x01, TReference = 1<<0, TBlock = 1<<1, TConstant = 1<<2, TString = 1<<3, TFlag = 1<<4, TAddress = 1<<5, OpAddr = 0x03, /* 1 op, const addr */ OpDeref = 0x06, OpConst1u = 0x08, /* 1 op, 1 byte const */ OpConst1s = 0x09, /* " signed */ OpConst2u = 0x0A, /* 1 op, 2 byte const */ OpConst2s = 0x0B, /* " signed */ OpConst4u = 0x0C, /* 1 op, 4 byte const */ OpConst4s = 0x0D, /* " signed */ OpConst8u = 0x0E, /* 1 op, 8 byte const */ OpConst8s = 0x0F, /* " signed */ OpConstu = 0x10, /* 1 op, LEB128 const */ OpConsts = 0x11, /* " signed */ OpDup = 0x12, OpDrop = 0x13, OpOver = 0x14, OpPick = 0x15, /* 1 op, 1 byte stack index */ OpSwap = 0x16, OpRot = 0x17, OpXderef = 0x18, OpAbs = 0x19, OpAnd = 0x1A, OpDiv = 0x1B, OpMinus = 0x1C, OpMod = 0x1D, OpMul = 0x1E, OpNeg = 0x1F, OpNot = 0x20, OpOr = 0x21, OpPlus = 0x22, OpPlusUconst = 0x23, /* 1 op, ULEB128 addend */ OpShl = 0x24, OpShr = 0x25, OpShra = 0x26, OpXor = 0x27, OpSkip = 0x2F, /* 1 op, signed 2-byte constant */ OpBra = 0x28, /* 1 op, signed 2-byte constant */ OpEq = 0x29, OpGe = 0x2A, OpGt = 0x2B, OpLe = 0x2C, OpLt = 0x2D, OpNe = 0x2E, OpLit0 = 0x30, /* OpLitN = OpLit0 + N for N = 0..31 */ OpReg0 = 0x50, /* OpRegN = OpReg0 + N for N = 0..31 */ OpBreg0 = 0x70, /* 1 op, signed LEB128 constant */ /* OpBregN = OpBreg0 + N for N = 0..31 */ OpRegx = 0x90, /* 1 op, ULEB128 register */ OpFbreg = 0x91, /* 1 op, SLEB128 offset */ OpBregx = 0x92, /* 2 op, ULEB128 reg, SLEB128 off */ OpPiece = 0x93, /* 1 op, ULEB128 size of piece */ OpDerefSize = 0x94, /* 1-byte size of data retrieved */ OpXderefSize = 0x95, /* 1-byte size of data retrieved */ OpNop = 0x96, /* next four new in Dwarf v3 */ OpPushObjAddr = 0x97, OpCall2 = 0x98, /* 2-byte offset of DIE */ OpCall4 = 0x99, /* 4-byte offset of DIE */ OpCallRef = 0x9A /* 4- or 8- byte offset of DIE */ /* 0xE0-0xFF reserved for user-specific */ }; struct DwarfBlock { uchar *data; ulong len; }; /* not for consumer use */ struct DwarfBuf { Dwarf *d; uchar *p; uchar *ep; uint addrsize; }; union DwarfVal { char *s; ulong c; ulong r; DwarfBlock b; }; struct DwarfAttrs { ulong tag; uchar haskids; /* whether we have it, along with type */ struct { uchar abstractorigin; uchar accessibility; uchar addrclass; uchar basetypes; uchar bitoffset; uchar bitsize; uchar bytesize; uchar calling; uchar commonref; uchar compdir; uchar constvalue; uchar containingtype; uchar count; uchar datamemberloc; uchar declcolumn; uchar declfile; uchar declline; uchar defaultvalue; uchar discr; uchar discrlist; uchar discrvalue; uchar encoding; uchar framebase; uchar friend; uchar highpc; uchar identifiercase; uchar import; uchar inlined; uchar isartificial; uchar isdeclaration; uchar isexternal; uchar isoptional; uchar isprototyped; uchar isvarparam; uchar language; uchar location; uchar lowerbound; uchar lowpc; uchar macroinfo; uchar name; uchar namelistitem; uchar ordering; uchar priority; uchar producer; uchar ranges; uchar returnaddr; uchar segment; uchar sibling; uchar specification; uchar startscope; uchar staticlink; uchar stmtlist; uchar stridesize; uchar stringlength; uchar type; uchar upperbound; uchar uselocation; uchar virtuality; uchar visibility; uchar vtableelemloc; } have; ulong abstractorigin; ulong accessibility; ulong addrclass; ulong basetypes; ulong bitoffset; ulong bitsize; ulong bytesize; ulong calling; ulong commonref; char* compdir; DwarfVal constvalue; ulong containingtype; ulong count; DwarfVal datamemberloc; ulong declcolumn; ulong declfile; ulong declline; ulong defaultvalue; ulong discr; DwarfBlock discrlist; ulong discrvalue; ulong encoding; DwarfVal framebase; ulong friend; ulong highpc; ulong identifiercase; ulong import; ulong inlined; uchar isartificial; uchar isdeclaration; uchar isexternal; uchar isoptional; uchar isprototyped; uchar isvarparam; ulong language; DwarfVal location; ulong lowerbound; ulong lowpc; ulong macroinfo; char* name; DwarfBlock namelistitem; ulong ordering; ulong priority; char* producer; ulong ranges; DwarfVal returnaddr; DwarfVal segment; ulong sibling; ulong specification; ulong startscope; DwarfVal staticlink; ulong stmtlist; ulong stridesize; DwarfVal stringlength; ulong type; ulong upperbound; DwarfVal uselocation; ulong virtuality; ulong visibility; DwarfVal vtableelemloc; }; enum { RuleUndef, RuleSame, RuleCfaOffset, RuleRegister, RuleRegOff, RuleLocation }; struct DwarfExpr { int type; long offset; ulong reg; DwarfBlock loc; }; struct DwarfSym { DwarfAttrs attrs; /* not for consumer use... */ DwarfBuf b; ulong unit; uint uoff; ulong aoff; int depth; int allunits; ulong nextunit; }; Dwarf *dwarfopen(Elf *elf); void dwarfclose(Dwarf*); int dwarfaddrtounit(Dwarf*, ulong, ulong*); int dwarflookupfn(Dwarf*, ulong, ulong, DwarfSym*); int dwarflookupname(Dwarf*, char*, DwarfSym*); int dwarflookupnameinunit(Dwarf*, ulong, char*, DwarfSym*); int dwarflookupsubname(Dwarf*, DwarfSym*, char*, DwarfSym*); int dwarflookuptag(Dwarf*, ulong, ulong, DwarfSym*); int dwarfenumunit(Dwarf*, ulong, DwarfSym*); int dwarfseeksym(Dwarf*, ulong, ulong, DwarfSym*); int dwarfenum(Dwarf*, DwarfSym*); int dwarfnextsym(Dwarf*, DwarfSym*); int dwarfnextsymat(Dwarf*, DwarfSym*, int); int dwarfpctoline(Dwarf*, ulong, char**, char**, char**, ulong*, ulong*, ulong*); int dwarfunwind(Dwarf*, ulong, DwarfExpr*, DwarfExpr*, DwarfExpr*, int); ulong dwarfget1(DwarfBuf*); ulong dwarfget2(DwarfBuf*); ulong dwarfget4(DwarfBuf*); uvlong dwarfget8(DwarfBuf*); ulong dwarfget128(DwarfBuf*); long dwarfget128s(DwarfBuf*); ulong dwarfgetaddr(DwarfBuf*); int dwarfgetn(DwarfBuf*, uchar*, int); uchar *dwarfgetnref(DwarfBuf*, ulong); char *dwarfgetstring(DwarfBuf*); typedef struct DwarfAbbrev DwarfAbbrev; typedef struct DwarfAttr DwarfAttr; struct DwarfAttr { ulong name; ulong form; }; struct DwarfAbbrev { ulong num; ulong tag; uchar haskids; DwarfAttr *attr; int nattr; }; struct Dwarf { Elf *elf; int fd; char **reg; int nreg; int addrsize; DwarfBlock abbrev; DwarfBlock aranges; DwarfBlock frame; DwarfBlock info; DwarfBlock line; DwarfBlock pubnames; DwarfBlock pubtypes; DwarfBlock ranges; DwarfBlock str; /* little cache */ struct { DwarfAbbrev *a; int na; ulong off; } acache; }; DwarfAbbrev *dwarfgetabbrev(Dwarf*, ulong, ulong); int dwarfgetinfounit(Dwarf*, ulong, DwarfBlock*); extern int dwarf386nregs; extern char *dwarf386regs[]; extern char *dwarf386fp;