From 3c31567f1492cbb03f08a8cd0de239fb5ff6f451 Mon Sep 17 00:00:00 2001 From: Bernard Xiong Date: Wed, 25 Apr 2018 23:25:49 +0800 Subject: [PATCH] [kernel] Fix vstart_addr issue in module. --- src/module.c | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/src/module.c b/src/module.c index b9801558d..b48fae941 100644 --- a/src/module.c +++ b/src/module.c @@ -636,7 +636,7 @@ static struct rt_module *_load_shared_object(const char *name, length = rt_strlen((const char *)(strtab + symtab[i].st_name)) + 1; module->symtab[count].addr = - (void *)(module->module_space + symtab[i].st_value); + (void *)(module->module_space + symtab[i].st_value - module->vstart_addr); module->symtab[count].name = rt_malloc(length); rt_memset((void *)module->symtab[count].name, 0, length); rt_memcpy((void *)module->symtab[count].name, @@ -1501,6 +1501,7 @@ rt_err_t rt_module_unload(rt_module_t module) { struct rt_object *object; struct rt_list_node *list; + rt_bool_t mdelete = RT_TRUE; RT_DEBUG_NOT_IN_INTERRUPT; @@ -1511,6 +1512,9 @@ rt_err_t rt_module_unload(rt_module_t module) rt_enter_critical(); if (!(module->parent.flag & RT_MODULE_FLAG_WITHOUTENTRY)) { + /* delete module in main thread destroy */ + mdelete = RT_FALSE; + /* delete all sub-threads */ list = &module->module_object[RT_Object_Class_Thread].object_list; while (list->next != list) @@ -1543,6 +1547,11 @@ rt_err_t rt_module_unload(rt_module_t module) } #endif + if (mdelete == RT_TRUE) + { + rt_module_destroy(module); + } + return RT_EOK; } -- GitLab