From b2fb4be8111ae46ca64e4b135cfd47895900a0e1 Mon Sep 17 00:00:00 2001 From: qiuyiuestc Date: Wed, 17 Nov 2010 15:41:10 +0000 Subject: [PATCH] add initial libdl git-svn-id: https://rt-thread.googlecode.com/svn/trunk@1052 bbd45198-f89e-11dd-88c7-29a3b14d5316 --- components/libdl/SConscript | 26 +++++++++++++++++++++++++ components/libdl/dlclose.c | 36 ++++++++++++++++++++++++++++++++++ components/libdl/dlerror.c | 24 +++++++++++++++++++++++ components/libdl/dlfcn.h | 16 +++++++++++++++ components/libdl/dlopen.c | 39 +++++++++++++++++++++++++++++++++++++ components/libdl/dlsym.c | 35 +++++++++++++++++++++++++++++++++ 6 files changed, 176 insertions(+) create mode 100644 components/libdl/SConscript create mode 100644 components/libdl/dlclose.c create mode 100644 components/libdl/dlerror.c create mode 100644 components/libdl/dlfcn.h create mode 100644 components/libdl/dlopen.c create mode 100644 components/libdl/dlsym.c diff --git a/components/libdl/SConscript b/components/libdl/SConscript new file mode 100644 index 0000000000..df7c8814ca --- /dev/null +++ b/components/libdl/SConscript @@ -0,0 +1,26 @@ +Import('env') +Import('projects') +Import('RTT_ROOT') +Import('rtconfig') + +# group definitions +group = {} +group['name'] = 'libdl' +group['src'] = Glob('*.c') +group['depend'] = 'RT_USING_LIBDL' +group['CCFLAGS'] = '' +group['CPPPATH'] = [RTT_ROOT + '/components/libdl'] +group['CPPDEFINES'] = '' +group['LINKFLAGS'] = '' + +# add group to project list +projects.append(group) + +env.Append(CCFLAGS = group['CCFLAGS']) +env.Append(CPPPATH = group['CPPPATH']) +env.Append(CPPDEFINES = group['CPPDEFINES']) +env.Append(LINKFLAGS = group['LINKFLAGS']) + +objs = env.Object(group['src']) + +Return('objs') diff --git a/components/libdl/dlclose.c b/components/libdl/dlclose.c new file mode 100644 index 0000000000..e040a21396 --- /dev/null +++ b/components/libdl/dlclose.c @@ -0,0 +1,36 @@ +/* + * File : dlclose.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2010-11-17 yi.qiu first version + */ + +#include +#include + +int rt_dlclose (void *handle) +{ + rt_module_t module; + + RT_ASSERT(handle != RT_NULL); + + module = (rt_module_t)handle; + module->nref--; + + if(module->nref <= 0) + { + rt_module_unload(module); + } + + return RT_TRUE; +} + +RTM_EXPORT(rt_dlclose) + diff --git a/components/libdl/dlerror.c b/components/libdl/dlerror.c new file mode 100644 index 0000000000..a4728a8a88 --- /dev/null +++ b/components/libdl/dlerror.c @@ -0,0 +1,24 @@ +/* + * File : dlerror.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2010-11-17 yi.qiu first version + */ + +#include +#include + +const char *rt_dlerror(void) +{ + return "TODO"; +} + +RTM_EXPORT(rt_dlerror) + diff --git a/components/libdl/dlfcn.h b/components/libdl/dlfcn.h new file mode 100644 index 0000000000..eea1d02d4b --- /dev/null +++ b/components/libdl/dlfcn.h @@ -0,0 +1,16 @@ +#ifndef __DLFCN_H_ +#define __DLFCN_H_ + +#define RTLD_LAZY 0x00000 +#define RTLD_NOW 0x00001 + +#define RTLD_LOCAL 0x00000 +#define RTLD_GLOBAL 0x10000 + +#define RTLD_DEFAULT ((void*)1) +#define RTLD_NEXT ((void*)2) + +void *rt_dlopen (const char *filename, int flag); +const char *rt_dlerror(void); +void *rt_dlsym(void *handle, const char *symbol); +int rt_dlclose (void *handle); diff --git a/components/libdl/dlopen.c b/components/libdl/dlopen.c new file mode 100644 index 0000000000..d392a94523 --- /dev/null +++ b/components/libdl/dlopen.c @@ -0,0 +1,39 @@ +/* + * File : dlopen.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2010-11-17 yi.qiu first version + */ + +#include +#include + +void* rt_dlopen(const char *filename, int flags) +{ + rt_module_t module; + + RT_ASSERT(filename != RT_NULL); + + /* find in module list */ + module = rt_module_find(filename); + + if(module) + { + module->nref++; + return (void*)module; + } + else + { + module = rt_module_open(filename); + } +} + +RTM_EXPORT(rt_dlopen) + diff --git a/components/libdl/dlsym.c b/components/libdl/dlsym.c new file mode 100644 index 0000000000..d1b5266ce1 --- /dev/null +++ b/components/libdl/dlsym.c @@ -0,0 +1,35 @@ +/* + * File : dlsym.c + * This file is part of RT-Thread RTOS + * COPYRIGHT (C) 2006 - 2010, RT-Thread Development Team + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rt-thread.org/license/LICENSE + * + * Change Logs: + * Date Author Notes + * 2010-11-17 yi.qiu first version + */ + +#include +#include + +void* rt_dlsym(void *handle, const char* symbol) +{ + int i; + rt_module_t module = (rt_module_t)handle; + + RT_ASSERT(handle != RT_NULL); + + for(i=0; insym; i++) + { + if (rt_strcmp(module->symtab[i].name, symbol) == 0) + return (void*)module->symtab[i].addr; + } + + return RT_NULL; +} + +RTM_EXPORT(rt_dlsym) + -- GitLab