/* * Copyright (c) 2004 Russ Cox. See LICENSE. */ /* /home/rsc/papers/elfXXelf.pdf */ typedef struct Elf Elf; typedef struct ElfHdr ElfHdr; typedef struct ElfSect ElfSect; typedef struct ElfProg ElfProg; typedef struct ElfNote ElfNote; typedef struct ElfSym ElfSym; enum { ElfClassNone = 0, ElfClass32, ElfClass64, ElfDataNone = 0, ElfDataLsb, ElfDataMsb, ElfTypeNone = 0, ElfTypeRelocatable, ElfTypeExecutable, ElfTypeSharedObject, ElfTypeCore, /* 0xFF00 - 0xFFFF reserved for processor-specific types */ ElfMachNone = 0, ElfMach32100, /* AT&T WE 32100 */ ElfMachSparc, /* SPARC */ ElfMach386, /* Intel 80386 */ ElfMach68000, /* Motorola 68000 */ ElfMach88000, /* Motorola 88000 */ ElfMach486, /* Intel 80486, no longer used */ ElfMach860, /* Intel 80860 */ ElfMachMips, /* MIPS RS3000 */ ElfMachS370, /* IBM System/370 */ ElfMachMipsLe, /* MIPS RS3000 LE */ ElfMachParisc = 15, /* HP PA RISC */ ElfMachVpp500 = 17, /* Fujitsu VPP500 */ ElfMachSparc32Plus, /* SPARC V8+ */ ElfMach960, /* Intel 80960 */ ElfMachPower, /* PowerPC */ ElfMachPower64, /* PowerPC 64 */ ElfMachS390, /* IBM System/390 */ ElfMachV800 = 36, /* NEC V800 */ ElfMachFr20, /* Fujitsu FR20 */ ElfMachRh32, /* TRW RH-32 */ ElfMachRce, /* Motorola RCE */ ElfMachArm, /* ARM */ ElfMachAlpha, /* Digital Alpha */ ElfMachSH, /* Hitachi SH */ ElfMachSparc9, /* SPARC V9 */ ElfMachAmd64 = 62, /* x86-64 */ /* and the list goes on... */ ElfAbiNone = 0, ElfAbiSystemV = 0, /* [sic] */ ElfAbiHPUX, ElfAbiNetBSD, ElfAbiLinux, ElfAbiSolaris = 6, ElfAbiAix, ElfAbiIrix, ElfAbiFreeBSD, ElfAbiTru64, ElfAbiModesto, ElfAbiOpenBSD, ElfAbiARM = 97, ElfAbiEmbedded = 255, /* some of sections 0xFF00 - 0xFFFF reserved for various things */ ElfSectNone = 0, ElfSectProgbits, ElfSectSymtab, ElfSectStrtab, ElfSectRela, ElfSectHash, ElfSectDynamic, ElfSectNote, ElfSectNobits, ElfSectRel, ElfSectShlib, ElfSectDynsym, ElfSectFlagWrite = 0x1, ElfSectFlagAlloc = 0x2, ElfSectFlagExec = 0x4, /* 0xF0000000 are reserved for processor specific */ ElfSymBindLocal = 0, ElfSymBindGlobal, ElfSymBindWeak, /* 13-15 reserved */ ElfSymTypeNone = 0, ElfSymTypeObject, ElfSymTypeFunc, ElfSymTypeSection, ElfSymTypeFile, /* 13-15 reserved */ ElfSymShnNone = 0, ElfSymShnAbs = 0xFFF1, ElfSymShnCommon = 0xFFF2, /* 0xFF00-0xFF1F reserved for processors */ /* 0xFF20-0xFF3F reserved for operating systems */ ElfProgNone = 0, ElfProgLoad, ElfProgDynamic, ElfProgInterp, ElfProgNote, ElfProgShlib, ElfProgPhdr, ElfProgFlagExec = 0x1, ElfProgFlagWrite = 0x2, ElfProgFlagRead = 0x4, ElfNotePrStatus = 1, ElfNotePrFpreg = 2, ElfNotePrPsinfo = 3, ElfNotePrTaskstruct = 4, ElfNotePrAuxv = 6, ElfNotePrXfpreg = 0x46e62b7f /* for gdb/386 */ }; struct ElfHdr { uchar magic[4]; uchar class; uchar encoding; uchar version; uchar abi; uchar abiversion; u32int type; u32int machine; u64int entry; u64int phoff; u64int shoff; u32int flags; u32int ehsize; u32int phentsize; u32int phnum; u32int shentsize; u32int shnum; u32int shstrndx; u16int (*e2)(uchar*); u32int (*e4)(uchar*); u64int (*e8)(uchar*); }; struct ElfSect { char *name; u32int type; u64int flags; u64int addr; u64int offset; u64int size; u32int link; u32int info; u64int align; u64int entsize; uchar *base; }; struct ElfProg { u32int type; u64int offset; u64int vaddr; u64int paddr; u64int filesz; u64int memsz; u32int flags; u64int align; }; struct ElfNote { u32int namesz; u32int descsz; u32int type; char *name; uchar *desc; u32int offset; /* in-memory only */ }; struct ElfSym { char* name; u64int value; u64int size; uchar bind; uchar type; uchar other; u16int shndx; }; struct Elf { int fd; ElfHdr hdr; ElfSect *sect; uint nsect; ElfProg *prog; uint nprog; char *shstrtab; int nsymtab; ElfSect *symtab; ElfSect *symstr; int ndynsym; ElfSect *dynsym; ElfSect *dynstr; ElfSect *bss; ulong dynamic; /* offset to elf dynamic crap */ int (*coreregs)(Elf*, ElfNote*, uchar**); int (*corecmd)(Elf*, ElfNote*, char**); }; Elf* elfopen(char*); Elf* elfinit(int); ElfSect *elfsection(Elf*, char*); void elfclose(Elf*); int elfsym(Elf*, int, ElfSym*); int elfsymlookup(Elf*, char*, ulong*); int elfmap(Elf*, ElfSect*); struct Fhdr; void elfcorelinux386(struct Fhdr*, Elf*, ElfNote*); void elfcorefreebsd386(struct Fhdr*, Elf*, ElfNote*); void elfcorefreebsdamd64(struct Fhdr*, Elf*, ElfNote*); void elfdl386mapdl(int);