plan9port

fork of plan9port with libvec, libstr and libsdb
Log | Files | Refs | README | LICENSE

elf.h (4524B)


      1 /*
      2  * Copyright (c) 2004 Russ Cox.  See LICENSE.
      3  */
      4 
      5 /* /home/rsc/papers/elfXXelf.pdf */
      6 
      7 typedef struct Elf Elf;
      8 typedef struct ElfHdr ElfHdr;
      9 typedef struct ElfSect ElfSect;
     10 typedef struct ElfProg ElfProg;
     11 typedef struct ElfNote ElfNote;
     12 typedef struct ElfSym ElfSym;
     13 
     14 enum
     15 {
     16 	ElfClassNone = 0,
     17 	ElfClass32,
     18 	ElfClass64,
     19 
     20 	ElfDataNone = 0,
     21 	ElfDataLsb,
     22 	ElfDataMsb,
     23 
     24 	ElfTypeNone = 0,
     25 	ElfTypeRelocatable,
     26 	ElfTypeExecutable,
     27 	ElfTypeSharedObject,
     28 	ElfTypeCore,
     29 	/* 0xFF00 - 0xFFFF reserved for processor-specific types */
     30 
     31 	ElfMachNone = 0,
     32 	ElfMach32100,		/* AT&T WE 32100 */
     33 	ElfMachSparc,		/* SPARC */
     34 	ElfMach386,		/* Intel 80386 */
     35 	ElfMach68000,		/* Motorola 68000 */
     36 	ElfMach88000,		/* Motorola 88000 */
     37 	ElfMach486,		/* Intel 80486, no longer used */
     38 	ElfMach860,		/* Intel 80860 */
     39 	ElfMachMips,		/* MIPS RS3000 */
     40 	ElfMachS370,		/* IBM System/370 */
     41 	ElfMachMipsLe,	/* MIPS RS3000 LE */
     42 	ElfMachParisc = 15,		/* HP PA RISC */
     43 	ElfMachVpp500 = 17,	/* Fujitsu VPP500 */
     44 	ElfMachSparc32Plus,	/* SPARC V8+ */
     45 	ElfMach960,		/* Intel 80960 */
     46 	ElfMachPower,		/* PowerPC */
     47 	ElfMachPower64,	/* PowerPC 64 */
     48 	ElfMachS390,		/* IBM System/390 */
     49 	ElfMachV800 = 36,	/* NEC V800 */
     50 	ElfMachFr20,		/* Fujitsu FR20 */
     51 	ElfMachRh32,		/* TRW RH-32 */
     52 	ElfMachRce,		/* Motorola RCE */
     53 	ElfMachArm,		/* ARM */
     54 	ElfMachAlpha,		/* Digital Alpha */
     55 	ElfMachSH,		/* Hitachi SH */
     56 	ElfMachSparc9,		/* SPARC V9 */
     57 	ElfMachAmd64 = 62,	/* x86-64 */
     58 	/* and the list goes on... */
     59 
     60 	ElfAbiNone = 0,
     61 	ElfAbiSystemV = 0,	/* [sic] */
     62 	ElfAbiHPUX,
     63 	ElfAbiNetBSD,
     64 	ElfAbiLinux,
     65 	ElfAbiSolaris = 6,
     66 	ElfAbiAix,
     67 	ElfAbiIrix,
     68 	ElfAbiFreeBSD,
     69 	ElfAbiTru64,
     70 	ElfAbiModesto,
     71 	ElfAbiOpenBSD,
     72 	ElfAbiARM = 97,
     73 	ElfAbiEmbedded = 255,
     74 
     75 	/* some of sections 0xFF00 - 0xFFFF reserved for various things */
     76 	ElfSectNone = 0,
     77 	ElfSectProgbits,
     78 	ElfSectSymtab,
     79 	ElfSectStrtab,
     80 	ElfSectRela,
     81 	ElfSectHash,
     82 	ElfSectDynamic,
     83 	ElfSectNote,
     84 	ElfSectNobits,
     85 	ElfSectRel,
     86 	ElfSectShlib,
     87 	ElfSectDynsym,
     88 
     89 	ElfSectFlagWrite = 0x1,
     90 	ElfSectFlagAlloc = 0x2,
     91 	ElfSectFlagExec = 0x4,
     92 	/* 0xF0000000 are reserved for processor specific */
     93 
     94 	ElfSymBindLocal = 0,
     95 	ElfSymBindGlobal,
     96 	ElfSymBindWeak,
     97 	/* 13-15 reserved */
     98 
     99 	ElfSymTypeNone = 0,
    100 	ElfSymTypeObject,
    101 	ElfSymTypeFunc,
    102 	ElfSymTypeSection,
    103 	ElfSymTypeFile,
    104 	/* 13-15 reserved */
    105 
    106 	ElfSymShnNone = 0,
    107 	ElfSymShnAbs = 0xFFF1,
    108 	ElfSymShnCommon = 0xFFF2,
    109 	/* 0xFF00-0xFF1F reserved for processors */
    110 	/* 0xFF20-0xFF3F reserved for operating systems */
    111 
    112 	ElfProgNone = 0,
    113 	ElfProgLoad,
    114 	ElfProgDynamic,
    115 	ElfProgInterp,
    116 	ElfProgNote,
    117 	ElfProgShlib,
    118 	ElfProgPhdr,
    119 
    120 	ElfProgFlagExec = 0x1,
    121 	ElfProgFlagWrite = 0x2,
    122 	ElfProgFlagRead = 0x4,
    123 
    124 	ElfNotePrStatus = 1,
    125 	ElfNotePrFpreg = 2,
    126 	ElfNotePrPsinfo = 3,
    127 	ElfNotePrTaskstruct = 4,
    128 	ElfNotePrAuxv = 6,
    129 	ElfNotePrXfpreg = 0x46e62b7f	/* for gdb/386 */
    130 };
    131 
    132 struct ElfHdr
    133 {
    134 	uchar	magic[4];
    135 	uchar	class;
    136 	uchar	encoding;
    137 	uchar	version;
    138 	uchar	abi;
    139 	uchar	abiversion;
    140 	u32int	type;
    141 	u32int	machine;
    142 	u64int	entry;
    143 	u64int	phoff;
    144 	u64int	shoff;
    145 	u32int	flags;
    146 	u32int	ehsize;
    147 	u32int	phentsize;
    148 	u32int	phnum;
    149 	u32int	shentsize;
    150 	u32int	shnum;
    151 	u32int	shstrndx;
    152 	u16int	(*e2)(uchar*);
    153 	u32int	(*e4)(uchar*);
    154 	u64int	(*e8)(uchar*);
    155 };
    156 
    157 struct ElfSect
    158 {
    159 	char		*name;
    160 	u32int	type;
    161 	u64int	flags;
    162 	u64int	addr;
    163 	u64int	offset;
    164 	u64int	size;
    165 	u32int	link;
    166 	u32int	info;
    167 	u64int	align;
    168 	u64int	entsize;
    169 	uchar	*base;
    170 };
    171 
    172 struct ElfProg
    173 {
    174 	u32int	type;
    175 	u64int	offset;
    176 	u64int	vaddr;
    177 	u64int	paddr;
    178 	u64int	filesz;
    179 	u64int	memsz;
    180 	u32int	flags;
    181 	u64int	align;
    182 };
    183 
    184 struct ElfNote
    185 {
    186 	u32int	namesz;
    187 	u32int	descsz;
    188 	u32int	type;
    189 	char	*name;
    190 	uchar	*desc;
    191 	u32int	offset;	/* in-memory only */
    192 };
    193 
    194 struct ElfSym
    195 {
    196 	char*	name;
    197 	u64int	value;
    198 	u64int	size;
    199 	uchar	bind;
    200 	uchar	type;
    201 	uchar	other;
    202 	u16int	shndx;
    203 };
    204 
    205 struct Elf
    206 {
    207 	int		fd;
    208 	ElfHdr	hdr;
    209 	ElfSect	*sect;
    210 	uint		nsect;
    211 	ElfProg	*prog;
    212 	uint		nprog;
    213 	char		*shstrtab;
    214 
    215 	int		nsymtab;
    216 	ElfSect	*symtab;
    217 	ElfSect	*symstr;
    218 	int		ndynsym;
    219 	ElfSect	*dynsym;
    220 	ElfSect	*dynstr;
    221 	ElfSect	*bss;
    222 	ulong	dynamic;		/* offset to elf dynamic crap */
    223 
    224 	int		(*coreregs)(Elf*, ElfNote*, uchar**);
    225 	int		(*corecmd)(Elf*, ElfNote*, char**);
    226 };
    227 
    228 Elf*	elfopen(char*);
    229 Elf*	elfinit(int);
    230 ElfSect *elfsection(Elf*, char*);
    231 void	elfclose(Elf*);
    232 int	elfsym(Elf*, int, ElfSym*);
    233 int	elfsymlookup(Elf*, char*, ulong*);
    234 int	elfmap(Elf*, ElfSect*);
    235 
    236 struct Fhdr;
    237 void	elfcorelinux386(struct Fhdr*, Elf*, ElfNote*);
    238 void	elfcorefreebsd386(struct Fhdr*, Elf*, ElfNote*);
    239 void	elfcorefreebsdamd64(struct Fhdr*, Elf*, ElfNote*);
    240 void	elfdl386mapdl(int);