|
#ifndef __LIBS_ELF_H__
|
|
#define __LIBS_ELF_H__
|
|
|
|
#include <defs.h>
|
|
|
|
#define ELF_MAGIC 0x464C457FU // "\x7FELF" in little endian
|
|
|
|
/* file header */
|
|
struct elfhdr {
|
|
uint32_t e_magic; // must equal ELF_MAGIC
|
|
uint8_t e_elf[12];
|
|
uint16_t e_type; // 1=relocatable, 2=executable, 3=shared object, 4=core image
|
|
uint16_t e_machine; // 3=x86, 4=68K, etc.
|
|
uint32_t e_version; // file version, always 1
|
|
uint32_t e_entry; // entry point if executable
|
|
uint32_t e_phoff; // file position of program header or 0
|
|
uint32_t e_shoff; // file position of section header or 0
|
|
uint32_t e_flags; // architecture-specific flags, usually 0
|
|
uint16_t e_ehsize; // size of this elf header
|
|
uint16_t e_phentsize; // size of an entry in program header
|
|
uint16_t e_phnum; // number of entries in program header or 0
|
|
uint16_t e_shentsize; // size of an entry in section header
|
|
uint16_t e_shnum; // number of entries in section header or 0
|
|
uint16_t e_shstrndx; // section number that contains section name strings
|
|
};
|
|
|
|
/* program section header */
|
|
struct proghdr {
|
|
uint32_t p_type; // loadable code or data, dynamic linking info,etc.
|
|
uint32_t p_offset; // file offset of segment
|
|
uint32_t p_va; // virtual address to map segment
|
|
uint32_t p_pa; // physical address, not used
|
|
uint32_t p_filesz; // size of segment in file
|
|
uint32_t p_memsz; // size of segment in memory (bigger if contains bss)
|
|
uint32_t p_flags; // read/write/execute bits
|
|
uint32_t p_align; // required alignment, invariably hardware page size
|
|
};
|
|
|
|
/* values for Proghdr::p_type */
|
|
#define ELF_PT_LOAD 1
|
|
|
|
/* flag bits for Proghdr::p_flags */
|
|
#define ELF_PF_X 1
|
|
#define ELF_PF_W 2
|
|
#define ELF_PF_R 4
|
|
|
|
#endif /* !__LIBS_ELF_H__ */
|
|
|