github.com/rohankumardubey/syslog-redirector-golang@v0.0.0-20140320174030-4859f03d829a/src/libmach/elf.h (about) 1 // Inferno libmach/elf.h 2 // http://code.google.com/p/inferno-os/source/browse/utils/libmach/elf.h 3 // 4 // Copyright © 1994-1999 Lucent Technologies Inc. 5 // Power PC support Copyright © 1995-2004 C H Forsyth (forsyth@terzarima.net). 6 // Portions Copyright © 1997-1999 Vita Nuova Limited. 7 // Portions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). 8 // Revisions Copyright © 2000-2004 Lucent Technologies Inc. and others. 9 // Portions Copyright © 2009 The Go Authors. All rights reserved. 10 // 11 // Permission is hereby granted, free of charge, to any person obtaining a copy 12 // of this software and associated documentation files (the "Software"), to deal 13 // in the Software without restriction, including without limitation the rights 14 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 15 // copies of the Software, and to permit persons to whom the Software is 16 // furnished to do so, subject to the following conditions: 17 // 18 // The above copyright notice and this permission notice shall be included in 19 // all copies or substantial portions of the Software. 20 // 21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 24 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 26 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 27 // THE SOFTWARE. 28 29 /* 30 * Definitions needed for accessing ELF headers. 31 * 32-bit and 64-bit structs differ. 32 */ 33 typedef struct { 34 uchar ident[16]; /* ident bytes */ 35 ushort type; /* file type */ 36 ushort machine; /* target machine */ 37 int version; /* file version */ 38 uint32 elfentry; /* start address */ 39 uint32 phoff; /* phdr file offset */ 40 uint32 shoff; /* shdr file offset */ 41 int flags; /* file flags */ 42 ushort ehsize; /* sizeof ehdr */ 43 ushort phentsize; /* sizeof phdr */ 44 ushort phnum; /* number phdrs */ 45 ushort shentsize; /* sizeof shdr */ 46 ushort shnum; /* number shdrs */ 47 ushort shstrndx; /* shdr string index */ 48 } Ehdr32; 49 50 typedef struct { 51 uchar ident[16]; /* ident bytes */ 52 ushort type; /* file type */ 53 ushort machine; /* target machine */ 54 int version; /* file version */ 55 uvlong elfentry; /* start address */ 56 uvlong phoff; /* phdr file offset */ 57 uvlong shoff; /* shdr file offset */ 58 int flags; /* file flags */ 59 ushort ehsize; /* sizeof ehdr */ 60 ushort phentsize; /* sizeof phdr */ 61 ushort phnum; /* number phdrs */ 62 ushort shentsize; /* sizeof shdr */ 63 ushort shnum; /* number shdrs */ 64 ushort shstrndx; /* shdr string index */ 65 } Ehdr64; 66 67 typedef struct { 68 int type; /* entry type */ 69 uint32 offset; /* file offset */ 70 uint32 vaddr; /* virtual address */ 71 uint32 paddr; /* physical address */ 72 int filesz; /* file size */ 73 uint32 memsz; /* memory size */ 74 int flags; /* entry flags */ 75 int align; /* memory/file alignment */ 76 } Phdr32; 77 78 typedef struct { 79 int type; /* entry type */ 80 int flags; /* entry flags */ 81 uvlong offset; /* file offset */ 82 uvlong vaddr; /* virtual address */ 83 uvlong paddr; /* physical address */ 84 uvlong filesz; /* file size */ 85 uvlong memsz; /* memory size */ 86 uvlong align; /* memory/file alignment */ 87 } Phdr64; 88 89 typedef struct { 90 uint32 name; /* section name */ 91 uint32 type; /* SHT_... */ 92 uint32 flags; /* SHF_... */ 93 uint32 addr; /* virtual address */ 94 uint32 offset; /* file offset */ 95 uint32 size; /* section size */ 96 uint32 link; /* misc info */ 97 uint32 info; /* misc info */ 98 uint32 addralign; /* memory alignment */ 99 uint32 entsize; /* entry size if table */ 100 } Shdr32; 101 102 typedef struct { 103 uint32 name; /* section name */ 104 uint32 type; /* SHT_... */ 105 uvlong flags; /* SHF_... */ 106 uvlong addr; /* virtual address */ 107 uvlong offset; /* file offset */ 108 uvlong size; /* section size */ 109 uint32 link; /* misc info */ 110 uint32 info; /* misc info */ 111 uvlong addralign; /* memory alignment */ 112 uvlong entsize; /* entry size if table */ 113 } Shdr64; 114 115 enum { 116 /* Ehdr codes */ 117 MAG0 = 0, /* ident[] indexes */ 118 MAG1 = 1, 119 MAG2 = 2, 120 MAG3 = 3, 121 CLASS = 4, 122 DATA = 5, 123 VERSION = 6, 124 125 ELFCLASSNONE = 0, /* ident[CLASS] */ 126 ELFCLASS32 = 1, 127 ELFCLASS64 = 2, 128 ELFCLASSNUM = 3, 129 130 ELFDATANONE = 0, /* ident[DATA] */ 131 ELFDATA2LSB = 1, 132 ELFDATA2MSB = 2, 133 ELFDATANUM = 3, 134 135 NOETYPE = 0, /* type */ 136 REL = 1, 137 EXEC = 2, 138 DYN = 3, 139 CORE = 4, 140 141 NONE = 0, /* machine */ 142 M32 = 1, /* AT&T WE 32100 */ 143 SPARC = 2, /* Sun SPARC */ 144 I386 = 3, /* Intel 80386 */ 145 M68K = 4, /* Motorola 68000 */ 146 M88K = 5, /* Motorola 88000 */ 147 I486 = 6, /* Intel 80486 */ 148 I860 = 7, /* Intel i860 */ 149 MIPS = 8, /* Mips R2000 */ 150 S370 = 9, /* Amdhal */ 151 SPARC64 = 18, /* Sun SPARC v9 */ 152 POWER = 20, /* PowerPC */ 153 ARM = 40, /* ARM */ 154 AMD64 = 62, /* Amd64 */ 155 156 NO_VERSION = 0, /* version, ident[VERSION] */ 157 CURRENT = 1, 158 159 /* Phdr Codes */ 160 NOPTYPE = 0, /* type */ 161 LOAD = 1, 162 DYNAMIC = 2, 163 INTERP = 3, 164 NOTE = 4, 165 SHLIB = 5, 166 PHDR = 6, 167 168 R = 0x4, /* flags */ 169 W = 0x2, 170 X = 0x1, 171 172 /* Shdr Codes */ 173 Progbits = 1, /* section types */ 174 Strtab = 3, 175 Nobits = 8, 176 177 Swrite = 1, /* section attributes */ 178 Salloc = 2, 179 Sexec = 4, 180 }; 181 182 #define ELF_MAG ((0x7f<<24) | ('E'<<16) | ('L'<<8) | 'F')