From ac3e6705d462d5918c1870062a9262958c1fec09 Mon Sep 17 00:00:00 2001 From: Aren Elchinyan Date: Thu, 1 Aug 2024 15:18:29 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9D=D0=B5=D0=B1=D0=BE=D0=BB=D1=8C=D1=88?= =?UTF-8?q?=D0=B8=D0=B5=20=D0=B8=D1=81=D0=BF=D1=80=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D1=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- include/version.h | 2 +- kernel/elf.c | 13 ++++++++----- kernel/mod.c | 7 ++++++- 3 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/version.h b/include/version.h index a6a0b1e..2d6bd32 100644 --- a/include/version.h +++ b/include/version.h @@ -1,3 +1,3 @@ #define VERSION_MAJOR 0 #define VERSION_MINOR 2 -#define VERSION_BUILD 94 +#define VERSION_BUILD 96 diff --git a/kernel/elf.c b/kernel/elf.c index 92a2c7e..3f91a11 100644 --- a/kernel/elf.c +++ b/kernel/elf.c @@ -9,6 +9,7 @@ #include #include + elf64_header_t *elf64_get_header(void *data) { return (elf64_header_t *)(data); } @@ -70,10 +71,12 @@ void *elf_entry(void *module_bin) { LOG("\t\tОшибка! Модуль неправильно собран!\n"); for (;;) { asm volatile("pause"); } } - elf_parse((elf64_header_t *)module_bin); + void *h = elf_parse((elf64_header_t *)module_bin); + + if (h == NULL) { return NULL; } // Возвращаем указатель на точку входа - return (void *)((uint64_t)elf_header->e_entry + (uint64_t)module_bin); + return (void *)((uint64_t)h + (uint64_t)module_bin); } void import_test( ) { @@ -86,7 +89,7 @@ void *elf_parse(elf64_header_t *head) { if (head->e_ident[0] != ELFMAG0 || head->e_ident[1] != ELFMAG1 || head->e_ident[2] != ELFMAG2 || head->e_ident[3] != ELFMAG3) { LOG("Ошибка: Неправильный формат!\n"); - return -1; + return NULL; } // LOG("Точка входа: 0x%x\n", head->e_entry); @@ -121,7 +124,7 @@ void *elf_parse(elf64_header_t *head) { if (tool_strcmp(string_table + sym->st_name, "import_test") == 0) { log_printf("0x%x\n", head + sym->st_value); void (*imp)( ) = (void *)head + sym->st_value; - *imp = &import_test; + // imp = &import_test; } break; case STT_FUNC: log_printf("объект кода\n"); break; @@ -139,5 +142,5 @@ void *elf_parse(elf64_header_t *head) { LOG("Таблица символов не найдена!\n"); } - return (void *)0; + return (void *)head->e_entry; } \ No newline at end of file diff --git a/kernel/mod.c b/kernel/mod.c index ca2ba6c..6db7e9f 100644 --- a/kernel/mod.c +++ b/kernel/mod.c @@ -117,7 +117,12 @@ void mod_init( ) { continue; } - module_info_t (*module_init)(env_t *env) = (module_info_t(*)(env_t * env)) elf_entry(module_ptr->address); + module_info_t (*module_init)(env_t * env) = (module_info_t(*)(env_t * env)) elf_entry(module_ptr->address); + + if (module_init == NULL) { + LOG("Модуль %s неисправен\n", module_ptr->cmdline); + continue; + } // LOG("\t->Точка входа: 0x%x\n", module_init);