mirror of
https://github.com/golang/go
synced 2024-11-22 09:14:40 -07:00
00274a13cb
R=rsc OCL=33273 CL=33276
183 lines
5.2 KiB
C
183 lines
5.2 KiB
C
// 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')
|