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