Merge branch 'master' into proc-work
[akaros.git] / kern / include / elf.h
1 #ifndef ROS_INC_ELF_H
2 #define ROS_INC_ELF_H
3
4 #include <arch/types.h>
5
6 #if defined(LITTLE_ENDIAN)
7 #  define ELF_MAGIC 0x464C457FU /* "\x7FELF" in little endian */
8 #elif defined(BIG_ENDIAN)
9 #  define ELF_MAGIC 0x7F454C46U /* "\x7FELF" in big endian */
10 #else
11 #  error I know not my endianness!
12 #endif
13
14 typedef struct Elf {
15         uint32_t e_magic;       // must equal ELF_MAGIC
16         uint8_t e_elf[12];
17         uint16_t e_type;
18         uint16_t e_machine;
19         uint32_t e_version;
20         uint32_t e_entry;
21         uint32_t e_phoff;
22         uint32_t e_shoff;
23         uint32_t e_flags;
24         uint16_t e_ehsize;
25         uint16_t e_phentsize;
26         uint16_t e_phnum;
27         uint16_t e_shentsize;
28         uint16_t e_shnum;
29         uint16_t e_shstrndx;
30 } elf_t;
31
32 typedef struct Proghdr {
33         uint32_t p_type;
34         uint32_t p_offset;
35         uint32_t p_va;
36         uint32_t p_pa;
37         uint32_t p_filesz;
38         uint32_t p_memsz;
39         uint32_t p_flags;
40         uint32_t p_align;
41 } proghdr_t;
42
43 typedef struct Secthdr {
44         uint32_t sh_name;
45         uint32_t sh_type;
46         uint32_t sh_flags;
47         uint32_t sh_addr;
48         uint32_t sh_offset;
49         uint32_t sh_size;
50         uint32_t sh_link;
51         uint32_t sh_info;
52         uint32_t sh_addralign;
53         uint32_t sh_entsize;
54 } secthdr_t;
55
56 // Values for Proghdr::p_type
57 #define ELF_PROG_LOAD           1
58
59 // Flag bits for Proghdr::p_flags
60 #define ELF_PROG_FLAG_EXEC      1
61 #define ELF_PROG_FLAG_WRITE     2
62 #define ELF_PROG_FLAG_READ      4
63
64 // Values for Secthdr::sh_type
65 #define ELF_SHT_NULL            0
66 #define ELF_SHT_PROGBITS        1
67 #define ELF_SHT_SYMTAB          2
68 #define ELF_SHT_STRTAB          3
69
70 // Values for Secthdr::sh_name
71 #define ELF_SHN_UNDEF           0
72
73 #endif /* !ROS_INC_ELF_H */