Lines Matching refs:module

17 #include <sys/module.h>
50 extern int load_segments(struct elf_module *module, Elf_Ehdr *elf_hdr);
52 static int prepare_dynlinking(struct elf_module *module) {
53 Elf_Dyn *dyn_entry = module->dyn_table;
64 if (module->nr_needed < MAX_NR_DEPS)
65 module->needed[module->nr_needed++] = dyn_entry->d_un.d_ptr;
72 module->hash_table =
73 (Elf_Word*)module_get_absolute(dyn_entry->d_un.d_ptr, module);
76 module->ghash_table =
77 (Elf_Word*)module_get_absolute(dyn_entry->d_un.d_ptr, module);
80 module->str_table =
81 (char*)module_get_absolute(dyn_entry->d_un.d_ptr, module);
84 module->sym_table =
85 module_get_absolute(dyn_entry->d_un.d_ptr, module);
88 module->strtable_size = dyn_entry->d_un.d_val;
91 module->syment_size = dyn_entry->d_un.d_val;
94 module->got = module_get_absolute(dyn_entry->d_un.d_ptr, module);
110 extern int perform_relocation(struct elf_module *module, Elf_Rel *rel);
111 extern int resolve_symbols(struct elf_module *module);
113 static int extract_operations(struct elf_module *module) {
119 ctors_start = module_find_symbol("__ctors_start", module);
120 ctors_end = module_find_symbol("__ctors_end", module);
127 start = module_get_absolute(ctors_start->st_value, module);
128 end = module_get_absolute(ctors_end->st_value, module);
145 module->ctors = ctors;
148 dtors_start = module_find_symbol("__dtors_start", module);
149 dtors_end = module_find_symbol("__dtors_end", module);
156 start = module_get_absolute(dtors_start->st_value, module);
157 end = module_get_absolute(dtors_end->st_value, module);
175 module->dtors = dtors;
181 // Loads the module into the system
182 int module_load(struct elf_module *module) {
190 if (module_find(module->name) != NULL) {
191 dprintf("Module %s is already loaded.\n", module->name);
196 res = image_load(module);
199 dprintf("Image load failed for %s\n", module->name);
203 // The module is a fully featured dynamic library
204 module->shallow = 0;
206 CHECKED(res, image_read(&elf_hdr, sizeof(Elf_Ehdr), module), error);
216 CHECKED(res, load_segments(module, &elf_hdr), error);
219 CHECKED(res, prepare_dynlinking(module), error);
225 if (module->str_table) {
232 for (i = module->nr_needed - 1; i >= 0; i--) {
236 dep = module->str_table + module->needed[i];
258 CHECKED(res, check_symbols(module), error);
261 main_sym = module_find_symbol("main", module);
263 module->main_func =
264 module_get_absolute(main_sym->st_value, module);
268 // Add the module at the beginning of the module list
269 list_add(&module->list, &modules_head);
272 resolve_symbols(module);
275 CHECKED(res, extract_operations(module), error);
277 //dprintf("module->symtable_size = %d\n", module->symtable_size);
279 //print_elf_symbols(module);
282 image_unload(module);
286 module->name,
287 (module->main_func == NULL) ? NULL : *(module->main_func),
288 (module->init_func == NULL) ? NULL : *(module->init_func),
289 (module->exit_func == NULL) ? NULL : *(module->exit_func));
292 for (ctor = module->ctors; ctor && *ctor; ctor++)
301 // Remove the module from the module list (if applicable)
302 list_del_init(&module->list);
304 if (module->module_addr != NULL) {
305 elf_free(module->module_addr);
306 module->module_addr = NULL;
309 image_unload(module);
311 // Clear the execution part of the module buffer
312 memset(&module->u, 0, sizeof module->u);