OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [orpsocv2/] [bench/] [sysc/] [include/] [elf.h] - Rev 462

Compare with Previous | Blame | View Log

#ifndef _LINUX_ELF_H
#define _LINUX_ELF_H
 
/*#if HAVE_CONFIG_H
#include <config.h>
#endif*/
 
#ifdef WORDS_BIGENDIAN
#define ELF_SHORT_H
#define ELF_LONG_H
#else
/* Load a short int from the following tables with big-endian formats */
#define ELF_SHORT_H(ps) ((((unsigned short)(ps) >> 8) & 0xff) |\
                         (((unsigned short)(ps) << 8) & 0xff00))
 
/* Load a long int from the following tables with big-endian formats */
#define ELF_LONG_H(ps) ((((unsigned long)(ps) >> 24) & 0xff) |\
                         (((unsigned long)(ps) >> 8) & 0xff00)|\
                         (((unsigned long)(ps) << 8) & 0xff0000)|\
                         (((unsigned long)(ps) << 24) & 0xff000000))
#endif
 
#ifdef OR32_TYPES
typedef uint32_t Elf32_Addr;
typedef uint16_t Elf32_Half;
typedef uint32_t Elf32_Off;
typedef int32_t Elf32_Sword;
typedef uint32_t Elf32_Word;
#else
typedef unsigned long Elf32_Addr;
typedef unsigned short Elf32_Half;
typedef unsigned long Elf32_Off;
typedef long Elf32_Sword;
typedef unsigned long Elf32_Word;
#endif
 
/* These constants are for the segment types stored in the image headers */
#define PT_NULL    0
#define PT_LOAD    1
#define PT_DYNAMIC 2
#define PT_INTERP  3
#define PT_NOTE    4
#define PT_SHLIB   5
#define PT_PHDR    6
#define PT_LOPROC  0x70000000
#define PT_HIPROC  0x7fffffff
 
/* These constants define the different elf file types */
#define ET_NONE   0
#define ET_REL    1
#define ET_EXEC   2
#define ET_DYN    3
#define ET_CORE   4
#define ET_LOPROC 5
#define ET_HIPROC 6
 
/* These constants define the various ELF target machines */
#define EM_NONE  0
#define EM_M32   1
#define EM_SPARC 2
#define EM_386   3
#define EM_68K   4
#define EM_88K   5
#define EM_486   6		/* Perhaps disused */
#define EM_860   7
 
#define EM_MIPS		8	/* MIPS R3000 (officially, big-endian only) */
 
#define EM_MIPS_RS4_BE 10	/* MIPS R4000 big-endian */
 
#define EM_SPARC64     11	/* SPARC v9 (not official) 64-bit */
 
#define EM_PARISC      15	/* HPPA */
 
#define EM_SPARC32PLUS 18	/* Sun's "v8plus" */
 
#define EM_PPC	       20	/* PowerPC */
 
/*
 * This is an interim value that we will use until the committee comes
 * up with a final number.
 */
#define EM_ALPHA	0x9026
 
/* This is the info that is needed to parse the dynamic section of the file */
#define DT_NULL		0
#define DT_NEEDED	1
#define DT_PLTRELSZ	2
#define DT_PLTGOT	3
#define DT_HASH		4
#define DT_STRTAB	5
#define DT_SYMTAB	6
#define DT_RELA		7
#define DT_RELASZ	8
#define DT_RELAENT	9
#define DT_STRSZ	10
#define DT_SYMENT	11
#define DT_INIT		12
#define DT_FINI		13
#define DT_SONAME	14
#define DT_RPATH 	15
#define DT_SYMBOLIC	16
#define DT_REL	        17
#define DT_RELSZ	18
#define DT_RELENT	19
#define DT_PLTREL	20
#define DT_DEBUG	21
#define DT_TEXTREL	22
#define DT_JMPREL	23
#define DT_LOPROC	0x70000000
#define DT_HIPROC	0x7fffffff
 
/* This info is needed when parsing the symbol table */
#define STB_LOCAL  0
#define STB_GLOBAL 1
#define STB_WEAK   2
 
#define STT_NOTYPE  0
#define STT_OBJECT  1
#define STT_FUNC    2
#define STT_SECTION 3
#define STT_FILE    4
 
#define ELF32_ST_BIND(x) ((x) >> 4)
#define ELF32_ST_TYPE(x) (((unsigned int) x) & 0xf)
 
/* Symbolic values for the entries in the auxiliary table
   put on the initial stack */
#define AT_NULL   0		/* end of vector */
#define AT_IGNORE 1		/* entry should be ignored */
#define AT_EXECFD 2		/* file descriptor of program */
#define AT_PHDR   3		/* program headers for program */
#define AT_PHENT  4		/* size of program header entry */
#define AT_PHNUM  5		/* number of program headers */
#define AT_PAGESZ 6		/* system page size */
#define AT_BASE   7		/* base address of interpreter */
#define AT_FLAGS  8		/* flags */
#define AT_ENTRY  9		/* entry point of program */
#define AT_NOTELF 10		/* program is not ELF */
#define AT_UID    11		/* real uid */
#define AT_EUID   12		/* effective uid */
#define AT_GID    13		/* real gid */
#define AT_EGID   14		/* effective gid */
 
typedef struct dynamic {
	Elf32_Sword d_tag;
	union {
		Elf32_Sword d_val;
		Elf32_Addr d_ptr;
	} d_un;
} Elf32_Dyn;
 
typedef struct {
	unsigned long long d_tag;	/* entry tag value */
	union {
		unsigned long long d_val;
		unsigned long long d_ptr;
	} d_un;
} Elf64_Dyn;
 
/* The following are used with relocations */
#define ELF32_R_SYM(x) ((x) >> 8)
#define ELF32_R_TYPE(x) ((x) & 0xff)
 
#define R_386_NONE	0
#define R_386_32	1
#define R_386_PC32	2
#define R_386_GOT32	3
#define R_386_PLT32	4
#define R_386_COPY	5
#define R_386_GLOB_DAT	6
#define R_386_JMP_SLOT	7
#define R_386_RELATIVE	8
#define R_386_GOTOFF	9
#define R_386_GOTPC	10
#define R_386_NUM	11
 
#define R_68K_NONE	0
#define R_68K_32	1
#define R_68K_16	2
#define R_68K_8		3
#define R_68K_PC32	4
#define R_68K_PC16	5
#define R_68K_PC8	6
#define R_68K_GOT32	7
#define R_68K_GOT16	8
#define R_68K_GOT8	9
#define R_68K_GOT32O	10
#define R_68K_GOT16O	11
#define R_68K_GOT8O	12
#define R_68K_PLT32	13
#define R_68K_PLT16	14
#define R_68K_PLT8	15
#define R_68K_PLT32O	16
#define R_68K_PLT16O	17
#define R_68K_PLT8O	18
#define R_68K_COPY	19
#define R_68K_GLOB_DAT	20
#define R_68K_JMP_SLOT	21
#define R_68K_RELATIVE	22
 
typedef struct elf32_rel {
	Elf32_Addr r_offset;
	Elf32_Word r_info;
} Elf32_Rel;
 
typedef struct elf64_rel {
	unsigned long long r_offset;	/* Location at which to apply the action */
	unsigned long long r_info;	/* index and type of relocation */
} Elf64_Rel;
 
typedef struct elf32_rela {
	Elf32_Addr r_offset;
	Elf32_Word r_info;
	Elf32_Sword r_addend;
} Elf32_Rela;
 
typedef struct elf64_rela {
	unsigned long long r_offset;	/* Location at which to apply the action */
	unsigned long long r_info;	/* index and type of relocation */
	unsigned long long r_addend;	/* Constant addend used to compute value */
} Elf64_Rela;
 
typedef struct elf32_sym {
	Elf32_Word st_name;
	Elf32_Addr st_value;
	Elf32_Word st_size;
	unsigned char st_info;
	unsigned char st_other;
	Elf32_Half st_shndx;
} Elf32_Sym;
 
typedef struct elf64_sym {
	unsigned int st_name;	/* Symbol name, index in string tbl */
	unsigned char st_info;	/* Type and binding attributes */
	unsigned char st_other;	/* No defined meaning, 0 */
	unsigned short st_shndx;	/* Associated section index */
	unsigned long long st_value;	/* Value of the symbol */
	unsigned long long st_size;	/* Associated symbol size */
} Elf64_Sym;
 
#define EI_NIDENT	16
 
typedef struct elf32_hdr {
	unsigned char e_ident[EI_NIDENT];
	Elf32_Half e_type;
	Elf32_Half e_machine;
	Elf32_Word e_version;
	Elf32_Addr e_entry;	/* Entry point */
	Elf32_Off e_phoff;
	Elf32_Off e_shoff;
	Elf32_Word e_flags;
	Elf32_Half e_ehsize;
	Elf32_Half e_phentsize;
	Elf32_Half e_phnum;
	Elf32_Half e_shentsize;
	Elf32_Half e_shnum;
	Elf32_Half e_shstrndx;
} Elf32_Ehdr;
 
typedef struct elf64_hdr {
	unsigned char e_ident[16];	/* ELF "magic number" */
	short int e_type;
	short unsigned int e_machine;
	int e_version;
	unsigned long long e_entry;	/* Entry point virtual address */
	unsigned long long e_phoff;	/* Program header table file offset */
	unsigned long long e_shoff;	/* Section header table file offset */
	int e_flags;
	short int e_ehsize;
	short int e_phentsize;
	short int e_phnum;
	short int e_shentsize;
	short int e_shnum;
	short int e_shstrndx;
} Elf64_Ehdr;
 
/* These constants define the permissions on sections in the program
   header, p_flags. */
#define PF_R		0x4
#define PF_W		0x2
#define PF_X		0x1
 
typedef struct elf32_phdr {
	Elf32_Word p_type;
	Elf32_Off p_offset;
	Elf32_Addr p_vaddr;
	Elf32_Addr p_paddr;
	Elf32_Word p_filesz;
	Elf32_Word p_memsz;
	Elf32_Word p_flags;
	Elf32_Word p_align;
} Elf32_Phdr;
 
typedef struct elf64_phdr {
	int p_type;
	int p_flags;
	unsigned long long p_offset;	/* Segment file offset */
	unsigned long long p_vaddr;	/* Segment virtual address */
	unsigned long long p_paddr;	/* Segment physical address */
	unsigned long long p_filesz;	/* Segment size in file */
	unsigned long long p_memsz;	/* Segment size in memory */
	unsigned long long p_align;	/* Segment alignment, file & memory */
} Elf64_Phdr;
 
/* sh_type */
#define SHT_NULL	0
#define SHT_PROGBITS	1
#define SHT_SYMTAB	2
#define SHT_STRTAB	3
#define SHT_RELA	4
#define SHT_HASH	5
#define SHT_DYNAMIC	6
#define SHT_NOTE	7
#define SHT_NOBITS	8
#define SHT_REL		9
#define SHT_SHLIB	10
#define SHT_DYNSYM	11
#define SHT_NUM		12
#define SHT_LOPROC	0x70000000
#define SHT_HIPROC	0x7fffffff
#define SHT_LOUSER	0x80000000
#define SHT_HIUSER	0xffffffff
 
/* sh_flags */
#define SHF_WRITE	0x1
#define SHF_ALLOC	0x2
#define SHF_EXECINSTR	0x4
#define SHF_MASKPROC	0xf0000000
 
/* special section indexes */
#define SHN_UNDEF	0
#define SHN_LORESERVE	0xff00
#define SHN_LOPROC	0xff00
#define SHN_HIPROC	0xff1f
#define SHN_ABS		0xfff1
#define SHN_COMMON	0xfff2
#define SHN_HIRESERVE	0xffff
 
typedef struct elf32_shdr {
	Elf32_Word sh_name;
	Elf32_Word sh_type;
	Elf32_Word sh_flags;
	Elf32_Addr sh_addr;
	Elf32_Off sh_offset;
	Elf32_Word sh_size;
	Elf32_Word sh_link;
	Elf32_Word sh_info;
	Elf32_Word sh_addralign;
	Elf32_Word sh_entsize;
} Elf32_Shdr;
 
typedef struct elf64_shdr {
	unsigned int sh_name;	/* Section name, index in string tbl */
	unsigned int sh_type;	/* Type of section */
	unsigned long long sh_flags;	/* Miscellaneous section attributes */
	unsigned long long sh_addr;	/* Section virtual addr at execution */
	unsigned long long sh_offset;	/* Section file offset */
	unsigned long long sh_size;	/* Size of section in bytes */
	unsigned int sh_link;	/* Index of another section */
	unsigned int sh_info;	/* Additional section information */
	unsigned long long sh_addralign;	/* Section alignment */
	unsigned long long sh_entsize;	/* Entry size if section holds table */
} Elf64_Shdr;
 
#define	EI_MAG0		0	/* e_ident[] indexes */
#define	EI_MAG1		1
#define	EI_MAG2		2
#define	EI_MAG3		3
#define	EI_CLASS	4
#define	EI_DATA		5
#define	EI_VERSION	6
#define	EI_PAD		7
 
#define	ELFMAG0		0x7f	/* EI_MAG */
#define	ELFMAG1		'E'
#define	ELFMAG2		'L'
#define	ELFMAG3		'F'
#define	ELFMAG		"\177ELF"
#define	SELFMAG		4
 
#define	ELFCLASSNONE	0	/* EI_CLASS */
#define	ELFCLASS32	1
#define	ELFCLASS64	2
#define	ELFCLASSNUM	3
 
#define ELFDATANONE	0	/* e_ident[EI_DATA] */
#define ELFDATA2LSB	1
#define ELFDATA2MSB	2
 
#define EV_NONE		0	/* e_version, EI_VERSION */
#define EV_CURRENT	1
#define EV_NUM		2
 
/* Notes used in ET_CORE */
#define NT_PRSTATUS	1
#define NT_PRFPREG	2
#define NT_PRPSINFO	3
#define NT_TASKSTRUCT	4
 
/* Note header in a PT_NOTE section */
typedef struct elf32_note {
	Elf32_Word n_namesz;	/* Name size */
	Elf32_Word n_descsz;	/* Content size */
	Elf32_Word n_type;	/* Content type */
} Elf32_Nhdr;
 
/* Note header in a PT_NOTE section */
/*
 * For now we use the 32 bit version of the structure until we figure
 * out whether we need anything better.  Note - on the Alpha, "unsigned int"
 * is only 32 bits.
 */
typedef struct elf64_note {
	unsigned int n_namesz;	/* Name size */
	unsigned int n_descsz;	/* Content size */
	unsigned int n_type;	/* Content type */
} Elf64_Nhdr;
 
#ifdef __mc68000__
#define ELF_START_MMAP 0xC0000000
#endif
#ifdef __i386__
#define ELF_START_MMAP 0x80000000
#endif
 
#if ELF_CLASS == ELFCLASS32
 
extern Elf32_Dyn _DYNAMIC[];
#define elfhdr		elf32_hdr
#define elf_phdr	elf32_phdr
#define elf_note	elf32_note
 
#else
 
extern Elf64_Dyn _DYNAMIC[];
#define elfhdr		elf64_hdr
#define elf_phdr	elf64_phdr
#define elf_note	elf64_note
 
#endif
 
#endif /* _LINUX_ELF_H */
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.