diff options
Diffstat (limited to 'src/libmach/elf.h')
-rw-r--r-- | src/libmach/elf.h | 182 |
1 files changed, 182 insertions, 0 deletions
diff --git a/src/libmach/elf.h b/src/libmach/elf.h new file mode 100644 index 000000000..8dbc983f0 --- /dev/null +++ b/src/libmach/elf.h @@ -0,0 +1,182 @@ +// Inferno libmach/elf.h +// http://code.google.com/p/inferno-os/source/browse/utils/libmach/elf.h +// +// Copyright © 1994-1999 Lucent Technologies Inc. +// Power PC support Copyright © 1995-2004 C H Forsyth (forsyth@terzarima.net). +// Portions Copyright © 1997-1999 Vita Nuova Limited. +// Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). +// Revisions Copyright © 2000-2004 Lucent Technologies Inc. and others. +// Portions Copyright © 2009 The Go Authors. All rights reserved. +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to deal +// in the Software without restriction, including without limitation the rights +// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +// copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +// THE SOFTWARE. + +/* + * Definitions needed for accessing ELF headers. + * 32-bit and 64-bit structs differ. + */ +typedef struct { + uchar ident[16]; /* ident bytes */ + ushort type; /* file type */ + ushort machine; /* target machine */ + int version; /* file version */ + uint32 elfentry; /* start address */ + uint32 phoff; /* phdr file offset */ + uint32 shoff; /* shdr file offset */ + int flags; /* file flags */ + ushort ehsize; /* sizeof ehdr */ + ushort phentsize; /* sizeof phdr */ + ushort phnum; /* number phdrs */ + ushort shentsize; /* sizeof shdr */ + ushort shnum; /* number shdrs */ + ushort shstrndx; /* shdr string index */ +} Ehdr32; + +typedef struct { + uchar ident[16]; /* ident bytes */ + ushort type; /* file type */ + ushort machine; /* target machine */ + int version; /* file version */ + uvlong elfentry; /* start address */ + uvlong phoff; /* phdr file offset */ + uvlong shoff; /* shdr file offset */ + int flags; /* file flags */ + ushort ehsize; /* sizeof ehdr */ + ushort phentsize; /* sizeof phdr */ + ushort phnum; /* number phdrs */ + ushort shentsize; /* sizeof shdr */ + ushort shnum; /* number shdrs */ + ushort shstrndx; /* shdr string index */ +} Ehdr64; + +typedef struct { + int type; /* entry type */ + uint32 offset; /* file offset */ + uint32 vaddr; /* virtual address */ + uint32 paddr; /* physical address */ + int filesz; /* file size */ + uint32 memsz; /* memory size */ + int flags; /* entry flags */ + int align; /* memory/file alignment */ +} Phdr32; + +typedef struct { + int type; /* entry type */ + int flags; /* entry flags */ + uvlong offset; /* file offset */ + uvlong vaddr; /* virtual address */ + uvlong paddr; /* physical address */ + uvlong filesz; /* file size */ + uvlong memsz; /* memory size */ + uvlong align; /* memory/file alignment */ +} Phdr64; + +typedef struct { + uint32 name; /* section name */ + uint32 type; /* SHT_... */ + uint32 flags; /* SHF_... */ + uint32 addr; /* virtual address */ + uint32 offset; /* file offset */ + uint32 size; /* section size */ + uint32 link; /* misc info */ + uint32 info; /* misc info */ + uint32 addralign; /* memory alignment */ + uint32 entsize; /* entry size if table */ +} Shdr32; + +typedef struct { + uint32 name; /* section name */ + uint32 type; /* SHT_... */ + uvlong flags; /* SHF_... */ + uvlong addr; /* virtual address */ + uvlong offset; /* file offset */ + uvlong size; /* section size */ + uint32 link; /* misc info */ + uint32 info; /* misc info */ + uvlong addralign; /* memory alignment */ + uvlong entsize; /* entry size if table */ +} Shdr64; + +enum { + /* Ehdr codes */ + MAG0 = 0, /* ident[] indexes */ + MAG1 = 1, + MAG2 = 2, + MAG3 = 3, + CLASS = 4, + DATA = 5, + VERSION = 6, + + ELFCLASSNONE = 0, /* ident[CLASS] */ + ELFCLASS32 = 1, + ELFCLASS64 = 2, + ELFCLASSNUM = 3, + + ELFDATANONE = 0, /* ident[DATA] */ + ELFDATA2LSB = 1, + ELFDATA2MSB = 2, + ELFDATANUM = 3, + + NOETYPE = 0, /* type */ + REL = 1, + EXEC = 2, + DYN = 3, + CORE = 4, + + NONE = 0, /* machine */ + M32 = 1, /* AT&T WE 32100 */ + SPARC = 2, /* Sun SPARC */ + I386 = 3, /* Intel 80386 */ + M68K = 4, /* Motorola 68000 */ + M88K = 5, /* Motorola 88000 */ + I486 = 6, /* Intel 80486 */ + I860 = 7, /* Intel i860 */ + MIPS = 8, /* Mips R2000 */ + S370 = 9, /* Amdhal */ + SPARC64 = 18, /* Sun SPARC v9 */ + POWER = 20, /* PowerPC */ + ARM = 40, /* ARM */ + AMD64 = 62, /* Amd64 */ + + NO_VERSION = 0, /* version, ident[VERSION] */ + CURRENT = 1, + + /* Phdr Codes */ + NOPTYPE = 0, /* type */ + LOAD = 1, + DYNAMIC = 2, + INTERP = 3, + NOTE = 4, + SHLIB = 5, + PHDR = 6, + + R = 0x4, /* flags */ + W = 0x2, + X = 0x1, + + /* Shdr Codes */ + Progbits = 1, /* section types */ + Strtab = 3, + Nobits = 8, + + Swrite = 1, /* section attributes */ + Salloc = 2, + Sexec = 4, +}; + +#define ELF_MAG ((0x7f<<24) | ('E'<<16) | ('L'<<8) | 'F') |