diff options
author | rsc <devnull@localhost> | 2004-04-19 19:29:25 +0000 |
---|---|---|
committer | rsc <devnull@localhost> | 2004-04-19 19:29:25 +0000 |
commit | a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46 (patch) | |
tree | 59a0e921597e5aa53e83d487c16727a7bf01547a /src/libmach/elf.h | |
parent | 0e3cc9f456ea49919459bf1164d0c8309a6134fa (diff) | |
download | plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.tar.gz plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.tar.bz2 plan9port-a84cbb2a17c9d0b88c561d5b7cb50d79a19e7c46.zip |
libmach
Diffstat (limited to 'src/libmach/elf.h')
-rw-r--r-- | src/libmach/elf.h | 233 |
1 files changed, 233 insertions, 0 deletions
diff --git a/src/libmach/elf.h b/src/libmach/elf.h new file mode 100644 index 00000000..6ed239bc --- /dev/null +++ b/src/libmach/elf.h @@ -0,0 +1,233 @@ +/* + * 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 */ + /* 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; + u32int entry; + u32int phoff; + u32int 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; + u32int flags; + u32int addr; + u32int offset; + u32int size; + u32int link; + u32int info; + u32int align; + u32int entsize; + uchar *base; +}; + +struct ElfProg +{ + u32int type; + u32int offset; + u32int vaddr; + u32int paddr; + u32int filesz; + u32int memsz; + u32int flags; + u32int align; +}; + +struct ElfNote +{ + u32int namesz; + u32int descsz; + u32int type; + char *name; + uchar *desc; + u32int offset; /* in-memory only */ +}; + +struct ElfSym +{ + char* name; + u32int value; + u32int 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; + + int (*coreregs)(Elf*, ElfNote*, uchar**); +}; + +Elf* elfopen(char*); +Elf* elfinit(int); +ElfSect *elfsection(Elf*, char*); +void elfclose(Elf*); +int elfsym(Elf*, int, ElfSym*); +int elfmap(Elf*, ElfSect*); + +int coreregslinux386(Elf*, ElfNote*, uchar**); +int coreregsfreebsd386(Elf*, ElfNote*, uchar**); |