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