xref: /nrf52832-nimble/rt-thread/components/libc/libdl/dlelf.h (revision 104654410c56c573564690304ae786df310c91fc)
1 /*
2  * Copyright (c) 2006-2018, RT-Thread Development Team
3  *
4  * SPDX-License-Identifier: Apache-2.0
5  *
6  * Change Logs:
7  * Date           Author      Notes
8  * 2018/08/29     Bernard     first version
9  */
10 
11 #ifndef DL_ELF_H__
12 #define DL_ELF_H__
13 
14 typedef rt_uint8_t              Elf_Byte;
15 
16 typedef rt_uint32_t             Elf32_Addr;    /* Unsigned program address */
17 typedef rt_uint32_t             Elf32_Off;     /* Unsigned file offset */
18 typedef rt_int32_t              Elf32_Sword;   /* Signed large integer */
19 typedef rt_uint32_t             Elf32_Word;    /* Unsigned large integer */
20 typedef rt_uint16_t             Elf32_Half;    /* Unsigned medium integer */
21 
22 /* e_ident[] magic number */
23 #define ELFMAG0                 0x7f           /* e_ident[EI_MAG0] */
24 #define ELFMAG1                 'E'            /* e_ident[EI_MAG1] */
25 #define ELFMAG2                 'L'            /* e_ident[EI_MAG2] */
26 #define ELFMAG3                 'F'            /* e_ident[EI_MAG3] */
27 #define RTMMAG                  "\177RTM"      /* magic */
28 #define ELFMAG                  "\177ELF"      /* magic */
29 #define SELFMAG                 4              /* size of magic */
30 
31 #define EI_CLASS                4              /* file class */
32 #define EI_NIDENT               16             /* Size of e_ident[] */
33 
34 /* e_ident[] file class */
35 #define ELFCLASSNONE            0              /* invalid */
36 #define ELFCLASS32              1              /* 32-bit objs */
37 #define ELFCLASS64              2              /* 64-bit objs */
38 #define ELFCLASSNUM             3              /* number of classes */
39 
40 /* e_ident[] data encoding */
41 #define ELFDATANONE             0              /* invalid */
42 #define ELFDATA2LSB             1              /* Little-Endian */
43 #define ELFDATA2MSB             2              /* Big-Endian */
44 #define ELFDATANUM              3              /* number of data encode defines */
45 
46 /* e_ident */
47 #define IS_ELF(ehdr)            ((ehdr).e_ident[EI_MAG0] == ELFMAG0 && \
48                                  (ehdr).e_ident[EI_MAG1] == ELFMAG1 && \
49                                  (ehdr).e_ident[EI_MAG2] == ELFMAG2 && \
50                                  (ehdr).e_ident[EI_MAG3] == ELFMAG3)
51 
52 #define ET_NONE                 0              /* No file type */
53 #define ET_REL                  1              /* Relocatable file */
54 #define ET_EXEC                 2              /* Executable file */
55 #define ET_DYN                  3              /* Shared object file */
56 #define ET_CORE                 4              /* Core file */
57 
58 /* ELF Header */
59 typedef struct elfhdr
60 {
61     unsigned char e_ident[EI_NIDENT];          /* ELF Identification */
62     Elf32_Half    e_type;                      /* object file type */
63     Elf32_Half    e_machine;                   /* machine */
64     Elf32_Word    e_version;                   /* object file version */
65     Elf32_Addr    e_entry;                     /* virtual entry point */
66     Elf32_Off     e_phoff;                     /* program header table offset */
67     Elf32_Off     e_shoff;                     /* section header table offset */
68     Elf32_Word    e_flags;                     /* processor-specific flags */
69     Elf32_Half    e_ehsize;                    /* ELF header size */
70     Elf32_Half    e_phentsize;                 /* program header entry size */
71     Elf32_Half    e_phnum;                     /* number of program header entries */
72     Elf32_Half    e_shentsize;                 /* section header entry size */
73     Elf32_Half    e_shnum;                     /* number of section header entries */
74     Elf32_Half    e_shstrndx;                  /* section header table's "section
75                                                   header string table" entry offset */
76 } Elf32_Ehdr;
77 
78 /* Section Header */
79 typedef struct
80 {
81     Elf32_Word sh_name;                        /* name - index into section header
82                                                   string table section */
83     Elf32_Word sh_type;                        /* type */
84     Elf32_Word sh_flags;                       /* flags */
85     Elf32_Addr sh_addr;                        /* address */
86     Elf32_Off  sh_offset;                      /* file offset */
87     Elf32_Word sh_size;                        /* section size */
88     Elf32_Word sh_link;                        /* section header table index link */
89     Elf32_Word sh_info;                        /* extra information */
90     Elf32_Word sh_addralign;                   /* address alignment */
91     Elf32_Word sh_entsize;                     /* section entry size */
92 } Elf32_Shdr;
93 
94 /* Section names */
95 #define ELF_BSS                 ".bss"         /* uninitialized data */
96 #define ELF_DATA                ".data"        /* initialized data */
97 #define ELF_DEBUG               ".debug"       /* debug */
98 #define ELF_DYNAMIC             ".dynamic"     /* dynamic linking information */
99 #define ELF_DYNSTR              ".dynstr"      /* dynamic string table */
100 #define ELF_DYNSYM              ".dynsym"      /* dynamic symbol table */
101 #define ELF_FINI                ".fini"        /* termination code */
102 #define ELF_GOT                 ".got"         /* global offset table */
103 #define ELF_HASH                ".hash"        /* symbol hash table */
104 #define ELF_INIT                ".init"        /* initialization code */
105 #define ELF_REL_DATA            ".rel.data"    /* relocation data */
106 #define ELF_REL_FINI            ".rel.fini"    /* relocation termination code */
107 #define ELF_REL_INIT            ".rel.init"    /* relocation initialization code */
108 #define ELF_REL_DYN             ".rel.dyn"     /* relocaltion dynamic link info */
109 #define ELF_REL_RODATA          ".rel.rodata"  /* relocation read-only data */
110 #define ELF_REL_TEXT            ".rel.text"    /* relocation code */
111 #define ELF_RODATA              ".rodata"      /* read-only data */
112 #define ELF_SHSTRTAB            ".shstrtab"    /* section header string table */
113 #define ELF_STRTAB              ".strtab"      /* string table */
114 #define ELF_SYMTAB              ".symtab"      /* symbol table */
115 #define ELF_TEXT                ".text"        /* code */
116 #define ELF_RTMSYMTAB           "RTMSymTab"
117 
118 /* Symbol Table Entry */
119 typedef struct elf32_sym
120 {
121     Elf32_Word    st_name;                     /* name - index into string table */
122     Elf32_Addr    st_value;                    /* symbol value */
123     Elf32_Word    st_size;                     /* symbol size */
124     unsigned char st_info;                     /* type and binding */
125     unsigned char st_other;                    /* 0 - no defined meaning */
126     Elf32_Half    st_shndx;                    /* section header index */
127 } Elf32_Sym;
128 
129 #define STB_LOCAL               0              /* BIND */
130 #define STB_GLOBAL              1
131 #define STB_WEAK                2
132 #define STB_NUM                 3
133 
134 #define STB_LOPROC              13             /* processor specific range */
135 #define STB_HIPROC              15
136 
137 #define STT_NOTYPE              0              /* symbol type is unspecified */
138 #define STT_OBJECT              1              /* data object */
139 #define STT_FUNC                2              /* code object */
140 #define STT_SECTION             3              /* symbol identifies an ELF section */
141 #define STT_FILE                4              /* symbol's name is file name */
142 #define STT_COMMON              5              /* common data object */
143 #define STT_TLS                 6              /* thread-local data object */
144 #define STT_NUM                 7              /* # defined types in generic range */
145 #define STT_LOOS                10             /* OS specific range */
146 #define STT_HIOS                12
147 #define STT_LOPROC              13             /* processor specific range */
148 #define STT_HIPROC              15
149 
150 #define STN_UNDEF               0              /* undefined */
151 
152 #define ELF_ST_BIND(info)       ((info) >> 4)
153 #define ELF_ST_TYPE(info)       ((info) & 0xf)
154 #define ELF_ST_INFO(bind, type) (((bind)<<4)+((type)&0xf))
155 
156 /* Relocation entry with implicit addend */
157 typedef struct
158 {
159     Elf32_Addr r_offset;                       /* offset of relocation */
160     Elf32_Word r_info;                         /* symbol table index and type */
161 } Elf32_Rel;
162 
163 /* Relocation entry with explicit addend */
164 typedef struct
165 {
166     Elf32_Addr  r_offset;                      /* offset of relocation */
167     Elf32_Word  r_info;                        /* symbol table index and type */
168     Elf32_Sword r_addend;
169 } Elf32_Rela;
170 
171 /* Extract relocation info - r_info */
172 #define ELF32_R_SYM(i)          ((i) >> 8)
173 #define ELF32_R_TYPE(i)         ((unsigned char) (i))
174 #define ELF32_R_INFO(s,t)       (((s) << 8) + (unsigned char)(t))
175 
176 /*
177  * Relocation type for arm
178  */
179 #define R_ARM_NONE              0
180 #define R_ARM_PC24              1
181 #define R_ARM_ABS32             2
182 #define R_ARM_REL32             3
183 #define R_ARM_THM_CALL          10
184 #define R_ARM_GLOB_DAT          21
185 #define R_ARM_JUMP_SLOT         22
186 #define R_ARM_RELATIVE          23
187 #define R_ARM_GOT_BREL          26
188 #define R_ARM_PLT32             27
189 #define R_ARM_CALL              28
190 #define R_ARM_JUMP24            29
191 #define R_ARM_THM_JUMP24        30
192 #define R_ARM_V4BX              40
193 
194 /*
195  * Relocation type for x86
196  */
197 #define R_386_NONE              0
198 #define R_386_32                1
199 #define R_386_PC32              2
200 #define R_386_GOT32             3
201 #define R_386_PLT32             4
202 #define R_386_COPY              5
203 #define R_386_GLOB_DAT          6
204 #define R_386_JMP_SLOT          7
205 #define R_386_RELATIVE          8
206 #define R_386_GOTOFF            9
207 #define R_386_GOTPC             10
208 
209 /* Program Header */
210 typedef struct
211 {
212     Elf32_Word p_type;                         /* segment type */
213     Elf32_Off  p_offset;                       /* segment offset */
214     Elf32_Addr p_vaddr;                        /* virtual address of segment */
215     Elf32_Addr p_paddr;                        /* physical address - ignored? */
216     Elf32_Word p_filesz;                       /* number of bytes in file for seg. */
217     Elf32_Word p_memsz;                        /* number of bytes in mem. for seg. */
218     Elf32_Word p_flags;                        /* flags */
219     Elf32_Word p_align;                        /* memory alignment */
220 } Elf32_Phdr;
221 
222 /* p_type */
223 #define PT_NULL                 0
224 #define PT_LOAD                 1
225 #define PT_DYNAMIC              2
226 #define PT_INTERP               3
227 #define PT_NOTE                 4
228 #define PT_SHLIB                5
229 #define PT_PHDR                 6
230 #define PT_TLS                  7
231 #define PT_NUM                  8
232 #define PT_LOOS                 0x60000000
233 #define PT_HIOS                 0x6fffffff
234 #define PT_LOPROC               0x70000000
235 #define PT_HIPROC               0x7fffffff
236 
237 /* p_flags */
238 #define PF_X                    1
239 #define PF_W                    2
240 #define PF_R                    4
241 
242 /* sh_type */
243 #define SHT_NULL                0              /* inactive */
244 #define SHT_PROGBITS            1              /* program defined information */
245 #define SHT_SYMTAB              2              /* symbol table section */
246 #define SHT_STRTAB              3              /* string table section */
247 #define SHT_RELA                4              /* relocation section with addends*/
248 #define SHT_HASH                5              /* symbol hash table section */
249 #define SHT_DYNAMIC             6              /* dynamic section */
250 #define SHT_NOTE                7              /* note section */
251 #define SHT_NOBITS              8              /* no space section */
252 #define SHT_REL                 9              /* relocation section without addends */
253 #define SHT_SHLIB               10             /* reserved - purpose unknown */
254 #define SHT_DYNSYM              11             /* dynamic symbol table section */
255 #define SHT_NUM                 12             /* number of section types */
256 #define SHT_LOPROC              0x70000000     /* reserved range for processor */
257 #define SHT_HIPROC              0x7fffffff     /* specific section header types */
258 #define SHT_LOUSER              0x80000000     /* reserved range for application */
259 #define SHT_HIUSER              0xffffffff     /* specific indexes */
260 
261 /* Section Attribute Flags - sh_flags */
262 #define SHF_WRITE               0x1            /* Writable */
263 #define SHF_ALLOC               0x2            /* occupies memory */
264 #define SHF_EXECINSTR           0x4            /* executable */
265 #define SHF_MASKPROC            0xf0000000     /* reserved bits for processor */
266 /* specific section attributes */
267 
268 #define IS_PROG(s)        (s.sh_type == SHT_PROGBITS)
269 #define IS_NOPROG(s)      (s.sh_type == SHT_NOBITS)
270 #define IS_REL(s)         (s.sh_type == SHT_REL)
271 #define IS_RELA(s)        (s.sh_type == SHT_RELA)
272 #define IS_ALLOC(s)       (s.sh_flags == SHF_ALLOC)
273 #define IS_AX(s)          ((s.sh_flags & SHF_ALLOC) && (s.sh_flags & SHF_EXECINSTR))
274 #define IS_AW(s)          ((s.sh_flags & SHF_ALLOC) && (s.sh_flags & SHF_WRITE))
275 
276 #define elf_module        ((Elf32_Ehdr *)module_ptr)
277 #define shdr              ((Elf32_Shdr *)((rt_uint8_t *)module_ptr + elf_module->e_shoff))
278 #define phdr              ((Elf32_Phdr *)((rt_uint8_t *)module_ptr + elf_module->e_phoff))
279 
280 rt_err_t dlmodule_load_shared_object(struct rt_dlmodule* module, void *module_ptr);
281 rt_err_t dlmodule_load_relocated_object(struct rt_dlmodule* module, void *module_ptr);
282 
283 int dlmodule_relocate(struct rt_dlmodule *module, Elf32_Rel *rel, Elf32_Addr sym_val);
284 
285 #endif
286