49 lines
1.9 KiB
C
49 lines
1.9 KiB
C
#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__ */
|
||
|