diff --git a/components/libdl/dlopen.c b/components/libdl/dlopen.c index 00405523e497fba5f293490b0ed61f6367ae8635..f31623083fc21d33e2545f8c56d16e90c6f5d6a4 100644 --- a/components/libdl/dlopen.c +++ b/components/libdl/dlopen.c @@ -15,24 +15,34 @@ #include #include +#define MODULE_ROOT_DIR "/module" + void* dlopen(const char *filename, int flags) { rt_module_t module; - + char *fullpath; + const char*def_path = MODULE_ROOT_DIR; + + /* check parameters */ RT_ASSERT(filename != RT_NULL); + if (filename[0] != '/') /* it's a absolute path, use it directly */ + { + fullpath = rt_malloc(strlen(def_path) + strlen(filename) + 2); + + /* join path and file name */ + rt_snprintf(fullpath, strlen(def_path) + strlen(filename) + 2, + "%s/%s", def_path, filename); + } + /* find in module list */ - module = rt_module_find(filename); + module = rt_module_find(fullpath); - if(module) - { - module->nref++; - return (void*)module; - } - else - { - module = rt_module_open(filename); - } + if(module != RT_NULL) module->nref++; + else module = rt_module_open(fullpath); + + rt_free(fullpath); + return (void*)module; } RTM_EXPORT(dlopen)