| /*- | 
 |  * Copyright (c) 1996-1998 John D. Polstra. | 
 |  * All rights reserved. | 
 |  * | 
 |  * Redistribution and use in source and binary forms, with or without | 
 |  * modification, are permitted provided that the following conditions | 
 |  * are met: | 
 |  * 1. Redistributions of source code must retain the above copyright | 
 |  *    notice, this list of conditions and the following disclaimer. | 
 |  * 2. Redistributions in binary form must reproduce the above copyright | 
 |  *    notice, this list of conditions and the following disclaimer in the | 
 |  *    documentation and/or other materials provided with the distribution. | 
 |  * | 
 |  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND | 
 |  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE | 
 |  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE | 
 |  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE | 
 |  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL | 
 |  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS | 
 |  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) | 
 |  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT | 
 |  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY | 
 |  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF | 
 |  * SUCH DAMAGE. | 
 |  * | 
 |  * $FreeBSD: src/sys/sys/elf32.h,v 1.13 2006/10/17 05:43:30 jkoshy Exp $ | 
 |  */ | 
 |  | 
 | #ifndef _SYS_ELF32_H_ | 
 | #define _SYS_ELF32_H_ 1 | 
 |  | 
 | #include "elf_common.h" | 
 |  | 
 | /* | 
 |  * ELF definitions common to all 32-bit architectures. | 
 |  */ | 
 |  | 
 | 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; | 
 | typedef uint64_t	Elf32_Lword; | 
 |  | 
 | typedef Elf32_Word	Elf32_Hashelt; | 
 |  | 
 | /* Non-standard class-dependent datatype used for abstraction. */ | 
 | typedef Elf32_Word	Elf32_Size; | 
 | typedef Elf32_Sword	Elf32_Ssize; | 
 |  | 
 | /* | 
 |  * ELF header. | 
 |  */ | 
 |  | 
 | typedef struct { | 
 |         unsigned char	e_ident[EI_NIDENT];	/* File identification. */ | 
 |         Elf32_Half	e_type;		/* File type. */ | 
 |         Elf32_Half	e_machine;	/* Machine architecture. */ | 
 |         Elf32_Word	e_version;	/* ELF format version. */ | 
 |         Elf32_Addr	e_entry;	/* Entry point. */ | 
 |         Elf32_Off	e_phoff;	/* Program header file offset. */ | 
 |         Elf32_Off	e_shoff;	/* Section header file offset. */ | 
 |         Elf32_Word	e_flags;	/* Architecture-specific flags. */ | 
 |         Elf32_Half	e_ehsize;	/* Size of ELF header in bytes. */ | 
 |         Elf32_Half	e_phentsize;	/* Size of program header entry. */ | 
 |         Elf32_Half	e_phnum;	/* Number of program header entries. */ | 
 |         Elf32_Half	e_shentsize;	/* Size of section header entry. */ | 
 |         Elf32_Half	e_shnum;	/* Number of section header entries. */ | 
 |         Elf32_Half	e_shstrndx;	/* Section name strings section. */ | 
 | } Elf32_Ehdr; | 
 |  | 
 | /* | 
 |  * Section header. | 
 |  */ | 
 |  | 
 | typedef struct { | 
 |         Elf32_Word	sh_name;	/* Section name (index into the | 
 |                                            section header string table). */ | 
 |         Elf32_Word	sh_type;	/* Section type. */ | 
 |         Elf32_Word	sh_flags;	/* Section flags. */ | 
 |         Elf32_Addr	sh_addr;	/* Address in memory image. */ | 
 |         Elf32_Off	sh_offset;	/* Offset in file. */ | 
 |         Elf32_Word	sh_size;	/* Size in bytes. */ | 
 |         Elf32_Word	sh_link;	/* Index of a related section. */ | 
 |         Elf32_Word	sh_info;	/* Depends on section type. */ | 
 |         Elf32_Word	sh_addralign;	/* Alignment in bytes. */ | 
 |         Elf32_Word	sh_entsize;	/* Size of each entry in section. */ | 
 | } Elf32_Shdr; | 
 |  | 
 | /* | 
 |  * Program header. | 
 |  */ | 
 |  | 
 | typedef struct { | 
 |         Elf32_Word	p_type;		/* Entry type. */ | 
 |         Elf32_Off	p_offset;	/* File offset of contents. */ | 
 |         Elf32_Addr	p_vaddr;	/* Virtual address in memory image. */ | 
 |         Elf32_Addr	p_paddr;	/* Physical address (not used). */ | 
 |         Elf32_Word	p_filesz;	/* Size of contents in file. */ | 
 |         Elf32_Word	p_memsz;	/* Size of contents in memory. */ | 
 |         Elf32_Word	p_flags;	/* Access permission flags. */ | 
 |         Elf32_Word	p_align;	/* Alignment in memory and file. */ | 
 | } Elf32_Phdr; | 
 |  | 
 | /* | 
 |  * Dynamic structure.  The ".dynamic" section contains an array of them. | 
 |  */ | 
 |  | 
 | typedef struct { | 
 |         Elf32_Sword	d_tag;		/* Entry type. */ | 
 |         union { | 
 |                 Elf32_Word	d_val;	/* Integer value. */ | 
 |                 Elf32_Addr	d_ptr;	/* Address value. */ | 
 |         } d_un; | 
 | } Elf32_Dyn; | 
 |  | 
 | /* | 
 |  * Relocation entries. | 
 |  */ | 
 |  | 
 | /* Relocations that don't need an addend field. */ | 
 | typedef struct { | 
 |         Elf32_Addr	r_offset;	/* Location to be relocated. */ | 
 |         Elf32_Word	r_info;		/* Relocation type and symbol index. */ | 
 | } Elf32_Rel; | 
 |  | 
 | /* Relocations that need an addend field. */ | 
 | typedef struct { | 
 |         Elf32_Addr	r_offset;	/* Location to be relocated. */ | 
 |         Elf32_Word	r_info;		/* Relocation type and symbol index. */ | 
 |         Elf32_Sword	r_addend;	/* Addend. */ | 
 | } Elf32_Rela; | 
 |  | 
 | /* Macros for accessing the fields of r_info. */ | 
 | #define ELF32_R_SYM(info)	((info) >> 8) | 
 | #define ELF32_R_TYPE(info)	((unsigned char)(info)) | 
 |  | 
 | /* Macro for constructing r_info from field values. */ | 
 | #define ELF32_R_INFO(sym, type)	(((sym) << 8) + (unsigned char)(type)) | 
 |  | 
 | /* | 
 |  *	Note entry header | 
 |  */ | 
 | typedef Elf_Note Elf32_Nhdr; | 
 |  | 
 | /* | 
 |  *	Move entry | 
 |  */ | 
 | typedef struct { | 
 |         Elf32_Lword	m_value;	/* symbol value */ | 
 |         Elf32_Word 	m_info;		/* size + index */ | 
 |         Elf32_Word	m_poffset;	/* symbol offset */ | 
 |         Elf32_Half	m_repeat;	/* repeat count */ | 
 |         Elf32_Half	m_stride;	/* stride info */ | 
 | } Elf32_Move; | 
 |  | 
 | /* | 
 |  *	The macros compose and decompose values for Move.r_info | 
 |  * | 
 |  *	sym = ELF32_M_SYM(M.m_info) | 
 |  *	size = ELF32_M_SIZE(M.m_info) | 
 |  *	M.m_info = ELF32_M_INFO(sym, size) | 
 |  */ | 
 | #define	ELF32_M_SYM(info)	((info)>>8) | 
 | #define	ELF32_M_SIZE(info)	((unsigned char)(info)) | 
 | #define	ELF32_M_INFO(sym, size)	(((sym)<<8)+(unsigned char)(size)) | 
 |  | 
 | /* | 
 |  *	Hardware/Software capabilities entry | 
 |  */ | 
 | typedef struct { | 
 |         Elf32_Word	c_tag;		/* how to interpret value */ | 
 |         union { | 
 |                 Elf32_Word	c_val; | 
 |                 Elf32_Addr	c_ptr; | 
 |         } c_un; | 
 | } Elf32_Cap; | 
 |  | 
 | /* | 
 |  * Symbol table entries. | 
 |  */ | 
 |  | 
 | typedef struct { | 
 |         Elf32_Word	st_name;	/* String table index of name. */ | 
 |         Elf32_Addr	st_value;	/* Symbol value. */ | 
 |         Elf32_Word	st_size;	/* Size of associated object. */ | 
 |         unsigned char	st_info;	/* Type and binding information. */ | 
 |         unsigned char	st_other;	/* Reserved (not used). */ | 
 |         Elf32_Half	st_shndx;	/* Section index of symbol. */ | 
 | } Elf32_Sym; | 
 |  | 
 | /* Macros for accessing the fields of st_info. */ | 
 | #define ELF32_ST_BIND(info)		((info) >> 4) | 
 | #define ELF32_ST_TYPE(info)		((info) & 0xf) | 
 |  | 
 | /* Macro for constructing st_info from field values. */ | 
 | #define ELF32_ST_INFO(bind, type)	(((bind) << 4) + ((type) & 0xf)) | 
 |  | 
 | /* Macro for accessing the fields of st_other. */ | 
 | #define ELF32_ST_VISIBILITY(oth)	((oth) & 0x3) | 
 |  | 
 | /* Structures used by Sun & GNU symbol versioning. */ | 
 | typedef struct | 
 | { | 
 |         Elf32_Half	vd_version; | 
 |         Elf32_Half	vd_flags; | 
 |         Elf32_Half	vd_ndx; | 
 |         Elf32_Half	vd_cnt; | 
 |         Elf32_Word	vd_hash; | 
 |         Elf32_Word	vd_aux; | 
 |         Elf32_Word	vd_next; | 
 | } Elf32_Verdef; | 
 |  | 
 | typedef struct | 
 | { | 
 |         Elf32_Word	vda_name; | 
 |         Elf32_Word	vda_next; | 
 | } Elf32_Verdaux; | 
 |  | 
 | typedef struct | 
 | { | 
 |         Elf32_Half	vn_version; | 
 |         Elf32_Half	vn_cnt; | 
 |         Elf32_Word	vn_file; | 
 |         Elf32_Word	vn_aux; | 
 |         Elf32_Word	vn_next; | 
 | } Elf32_Verneed; | 
 |  | 
 | typedef struct | 
 | { | 
 |         Elf32_Word	vna_hash; | 
 |         Elf32_Half	vna_flags; | 
 |         Elf32_Half	vna_other; | 
 |         Elf32_Word	vna_name; | 
 |         Elf32_Word	vna_next; | 
 | } Elf32_Vernaux; | 
 |  | 
 | typedef Elf32_Half Elf32_Versym; | 
 |  | 
 | typedef struct { | 
 |         Elf32_Half	si_boundto;	/* direct bindings - symbol bound to */ | 
 |         Elf32_Half	si_flags;	/* per symbol flags */ | 
 | } Elf32_Syminfo; | 
 |  | 
 | #endif /* !_SYS_ELF32_H_ */ |