rlm@1: #ifndef VBA_ELF_H rlm@1: #define VBA_ELF_H rlm@1: rlm@1: #if _MSC_VER > 1000 rlm@1: #pragma once rlm@1: #endif // _MSC_VER > 1000 rlm@1: rlm@1: enum LocationType rlm@1: { rlm@1: LOCATION_register, rlm@1: LOCATION_memory, rlm@1: LOCATION_value rlm@1: }; rlm@1: rlm@1: #define DW_ATE_boolean 0x02 rlm@1: #define DW_ATE_signed 0x05 rlm@1: #define DW_ATE_unsigned 0x07 rlm@1: #define DW_ATE_unsigned_char 0x08 rlm@1: rlm@1: struct ELFHeader rlm@1: { rlm@1: u32 magic; rlm@1: u8 clazz; rlm@1: u8 data; rlm@1: u8 version; rlm@1: u8 pad[9]; rlm@1: u16 e_type; rlm@1: u16 e_machine; rlm@1: u32 e_version; rlm@1: u32 e_entry; rlm@1: u32 e_phoff; rlm@1: u32 e_shoff; rlm@1: u32 e_flags; rlm@1: u16 e_ehsize; rlm@1: u16 e_phentsize; rlm@1: u16 e_phnum; rlm@1: u16 e_shentsize; rlm@1: u16 e_shnum; rlm@1: u16 e_shstrndx; rlm@1: }; rlm@1: rlm@1: struct ELFProgramHeader rlm@1: { rlm@1: u32 type; rlm@1: u32 offset; rlm@1: u32 vaddr; rlm@1: u32 paddr; rlm@1: u32 filesz; rlm@1: u32 memsz; rlm@1: u32 flags; rlm@1: u32 align; rlm@1: }; rlm@1: rlm@1: struct ELFSectionHeader rlm@1: { rlm@1: u32 name; rlm@1: u32 type; rlm@1: u32 flags; rlm@1: u32 addr; rlm@1: u32 offset; rlm@1: u32 size; rlm@1: u32 link; rlm@1: u32 info; rlm@1: u32 addralign; rlm@1: u32 entsize; rlm@1: }; rlm@1: rlm@1: struct ELFSymbol rlm@1: { rlm@1: u32 name; rlm@1: u32 value; rlm@1: u32 size; rlm@1: u8 info; rlm@1: u8 other; rlm@1: u16 shndx; rlm@1: }; rlm@1: rlm@1: struct ELFBlock rlm@1: { rlm@1: int length; rlm@1: u8 *data; rlm@1: }; rlm@1: rlm@1: struct ELFAttr rlm@1: { rlm@1: u32 name; rlm@1: u32 form; rlm@1: union rlm@1: { rlm@1: u32 value; rlm@1: char * string; rlm@1: u8 * data; rlm@1: bool flag; rlm@1: ELFBlock *block; rlm@1: }; rlm@1: }; rlm@1: rlm@1: struct ELFAbbrev rlm@1: { rlm@1: u32 number; rlm@1: u32 tag; rlm@1: bool hasChildren; rlm@1: int numAttrs; rlm@1: ELFAttr * attrs; rlm@1: ELFAbbrev *next; rlm@1: }; rlm@1: rlm@1: enum TypeEnum rlm@1: { rlm@1: TYPE_base, rlm@1: TYPE_pointer, rlm@1: TYPE_function, rlm@1: TYPE_void, rlm@1: TYPE_array, rlm@1: TYPE_struct, rlm@1: TYPE_reference, rlm@1: TYPE_enum, rlm@1: TYPE_union rlm@1: }; rlm@1: rlm@1: struct Type; rlm@1: struct Object; rlm@1: rlm@1: struct FunctionType rlm@1: { rlm@1: Type * returnType; rlm@1: Object *args; rlm@1: }; rlm@1: rlm@1: struct Member rlm@1: { rlm@1: char * name; rlm@1: Type * type; rlm@1: int bitSize; rlm@1: int bitOffset; rlm@1: int byteSize; rlm@1: ELFBlock *location; rlm@1: }; rlm@1: rlm@1: struct Struct rlm@1: { rlm@1: int memberCount; rlm@1: Member *members; rlm@1: }; rlm@1: rlm@1: struct Array rlm@1: { rlm@1: Type *type; rlm@1: int maxBounds; rlm@1: int * bounds; rlm@1: }; rlm@1: rlm@1: struct EnumMember rlm@1: { rlm@1: char *name; rlm@1: u32 value; rlm@1: }; rlm@1: rlm@1: struct Enum rlm@1: { rlm@1: int count; rlm@1: EnumMember *members; rlm@1: }; rlm@1: rlm@1: struct Type rlm@1: { rlm@1: u32 offset; rlm@1: TypeEnum type; rlm@1: char * name; rlm@1: int encoding; rlm@1: int size; rlm@1: int bitSize; rlm@1: union rlm@1: { rlm@1: Type * pointer; rlm@1: FunctionType *function; rlm@1: Array * array; rlm@1: Struct * structure; rlm@1: Enum * enumeration; rlm@1: }; rlm@1: Type *next; rlm@1: }; rlm@1: rlm@1: struct Object rlm@1: { rlm@1: char * name; rlm@1: int file; rlm@1: int line; rlm@1: bool external; rlm@1: Type * type; rlm@1: ELFBlock *location; rlm@1: u32 startScope; rlm@1: u32 endScope; rlm@1: Object * next; rlm@1: }; rlm@1: rlm@1: struct Function rlm@1: { rlm@1: char * name; rlm@1: u32 lowPC; rlm@1: u32 highPC; rlm@1: int file; rlm@1: int line; rlm@1: bool external; rlm@1: Type * returnType; rlm@1: Object * parameters; rlm@1: Object * variables; rlm@1: ELFBlock *frameBase; rlm@1: Function *next; rlm@1: }; rlm@1: rlm@1: struct LineInfoItem rlm@1: { rlm@1: u32 address; rlm@1: char *file; rlm@1: int line; rlm@1: }; rlm@1: rlm@1: struct LineInfo rlm@1: { rlm@1: int fileCount; rlm@1: char ** files; rlm@1: int number; rlm@1: LineInfoItem *lines; rlm@1: }; rlm@1: rlm@1: struct ARange rlm@1: { rlm@1: u32 lowPC; rlm@1: u32 highPC; rlm@1: }; rlm@1: rlm@1: struct ARanges rlm@1: { rlm@1: u32 offset; rlm@1: int count; rlm@1: ARange *ranges; rlm@1: }; rlm@1: rlm@1: struct CompileUnit rlm@1: { rlm@1: u32 length; rlm@1: u8 * top; rlm@1: u32 offset; rlm@1: ELFAbbrev ** abbrevs; rlm@1: ARanges * ranges; rlm@1: char * name; rlm@1: char * compdir; rlm@1: u32 lowPC; rlm@1: u32 highPC; rlm@1: bool hasLineInfo; rlm@1: u32 lineInfo; rlm@1: LineInfo * lineInfoTable; rlm@1: Function * functions; rlm@1: Function * lastFunction; rlm@1: Object * variables; rlm@1: Type * types; rlm@1: CompileUnit *next; rlm@1: }; rlm@1: rlm@1: struct DebugInfo rlm@1: { rlm@1: u8 * debugfile; rlm@1: u8 * abbrevdata; rlm@1: u8 * debugdata; rlm@1: u8 * infodata; rlm@1: int numRanges; rlm@1: ARanges *ranges; rlm@1: }; rlm@1: rlm@1: struct Symbol rlm@1: { rlm@1: char *name; rlm@1: int type; rlm@1: int binding; rlm@1: u32 address; rlm@1: u32 value; rlm@1: u32 size; rlm@1: }; rlm@1: rlm@1: extern u32 elfReadLEB128(u8 *, int *); rlm@1: extern s32 elfReadSignedLEB128(u8 *, int *); rlm@1: extern bool elfRead(const char *, int &, FILE *f); rlm@1: extern bool elfGetSymbolAddress(char *, u32 *, u32 *, int *); rlm@1: extern char *elfGetAddressSymbol(u32); rlm@1: extern char *elfGetSymbol(int, u32 *, u32 *, int *); rlm@1: extern void elfCleanUp(); rlm@1: extern bool elfGetCurrentFunction(u32, Function **, CompileUnit **c); rlm@1: extern bool elfGetObject(char *, Function *, CompileUnit *, Object * *); rlm@1: extern bool elfFindLineInUnit(u32 *, CompileUnit *, int); rlm@1: extern bool elfFindLineInModule(u32 *, char *, int); rlm@1: u32 elfDecodeLocation(Function *, ELFBlock *, LocationType *); rlm@1: u32 elfDecodeLocation(Function *, ELFBlock *, LocationType *, u32); rlm@1: int elfFindLine(CompileUnit *unit, Function *func, u32 addr, char * *); rlm@1: rlm@1: #endif // VBA_ELF_H