blob: 856717f760783e23e7484a20aa78cfab35de5fc8 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
|
#ifndef ELF_MODULE_H_
#define ELF_MODULE_H_
#include <stdio.h>
#include <elf.h>
#include <stdint.h>
#include "linux_list.h"
#define MODULE_NAME_SIZE 64
#define MODULE_ELF_CLASS ELFCLASS32
#define MODULE_ELF_CLASS_SIZE 32
#define MODULE_ELF_DATA ELFDATA2LSB
#define MODULE_ELF_VERSION EV_CURRENT
#define MODULE_ELF_TYPE ET_DYN
#define MODULE_ELF_MACHINE EM_386
typedef int (*module_init_func)();
typedef void (*module_exit_func)();
// Structure encapsulating a module loaded in memory
struct elf_module {
char name[MODULE_NAME_SIZE]; // The module name
struct list_head deps; // Head of module dependency list
struct list_head list; // The list entry in the module list
module_init_func init_func; // The initialization entry point
module_exit_func exit_func; // The module finalization code
void *module_addr; // The module location in the memory
Elf32_Addr base_addr; // The base address of the module
Elf32_Word module_size; // The module size in memory
Elf32_Word *hash_table; // The symbol hash table
Elf32_Word *ghash_table; // The GNU style hash table
char *str_table; // The string table
void *sym_table; // The symbol table
void *got; // The Global Offset Table
Elf32_Dyn *dyn_table; // Dynamic loading information table
Elf32_Word strtable_size; // The size of the string table
Elf32_Word syment_size; // The size of a symbol entry
// Transient - Data available while the module is loading
FILE *_file; // The file object of the open file
Elf32_Off _cr_offset; // The current offset in the open file
};
// Structure encapsulating a module dependency need
struct module_dep {
struct list_head list; // The list entry in the dependency list
struct elf_module *module;
};
// Initialization of the module subsystem
extern int modules_init();
// Termination of the module subsystem
extern void modules_term();
// Allocates the structure for a new module
extern struct elf_module *module_alloc(const char *name);
// Loads the module into the system
extern int module_load(struct elf_module *module);
// Unloads the module from the system and releases all the associated memory
extern int module_unload(struct elf_module *module);
extern Elf32_Sym *module_find_symbol(const char *name, struct elf_module *module);
extern Elf32_Sym *global_find_symbol(const char *name, struct elf_module **module);
static inline void *module_get_absolute(Elf32_Addr addr, struct elf_module *module) {
return (void*)(module->base_addr + addr);
}
#endif /*ELF_MODULE_H_*/
|