Hella ABI changes for ELF dynamic linking
[akaros.git] / kern / include / elf.h
1 #ifndef ROS_INC_ELF_H
2 #define ROS_INC_ELF_H
3
4 #include <process.h>
5 #include <ros/common.h>
6
7 #if defined(LITTLE_ENDIAN)
8 #  define ELF_MAGIC 0x464C457FU /* "\x7FELF" in little endian */
9 #elif defined(BIG_ENDIAN)
10 #  define ELF_MAGIC 0x7F454C46U /* "\x7FELF" in big endian */
11 #else
12 #  error I know not my endianness!
13 #endif
14
15 typedef struct Elf {
16         uint32_t e_magic;       // must equal ELF_MAGIC
17         uint8_t e_elf[12];
18         uint16_t e_type;
19         uint16_t e_machine;
20         uint32_t e_version;
21         uint32_t e_entry;
22         uint32_t e_phoff;
23         uint32_t e_shoff;
24         uint32_t e_flags;
25         uint16_t e_ehsize;
26         uint16_t e_phentsize;
27         uint16_t e_phnum;
28         uint16_t e_shentsize;
29         uint16_t e_shnum;
30         uint16_t e_shstrndx;
31 } elf_t;
32
33 typedef struct Proghdr {
34         uint32_t p_type;
35         uint32_t p_offset;
36         uint32_t p_va;
37         uint32_t p_pa;
38         uint32_t p_filesz;
39         uint32_t p_memsz;
40         uint32_t p_flags;
41         uint32_t p_align;
42 } proghdr_t;
43
44 typedef struct Secthdr {
45         uint32_t sh_name;
46         uint32_t sh_type;
47         uint32_t sh_flags;
48         uint32_t sh_addr;
49         uint32_t sh_offset;
50         uint32_t sh_size;
51         uint32_t sh_link;
52         uint32_t sh_info;
53         uint32_t sh_addralign;
54         uint32_t sh_entsize;
55 } secthdr_t;
56
57 typedef long elf_aux_t[2];
58
59 // Values for Proghdr::p_type
60 #define ELF_PROG_LOAD           1
61 #define ELF_PROG_INTERP         3
62 #define ELF_PROG_PHDR           6
63
64 // Flag bits for Proghdr::p_flags
65 #define ELF_PROG_FLAG_EXEC      1
66 #define ELF_PROG_FLAG_WRITE     2
67 #define ELF_PROG_FLAG_READ      4
68
69 // Values for Secthdr::sh_type
70 #define ELF_SHT_NULL            0
71 #define ELF_SHT_PROGBITS        1
72 #define ELF_SHT_SYMTAB          2
73 #define ELF_SHT_STRTAB          3
74
75 // Values for Secthdr::sh_name
76 #define ELF_SHN_UNDEF           0
77
78 // Values for auxiliary fields
79 #define ELF_AUX_PHDR            3
80 #define ELF_AUX_PHENT           4
81 #define ELF_AUX_PHNUM           5
82 #define ELF_AUX_ENTRY           9
83
84 int load_elf(struct proc* p, const char* fn);
85
86 #endif /* !ROS_INC_ELF_H */