// 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')