Implemented the unix dlfcn API; note, the RTLD_xxx modes are not yet supported

by the loader. dlerror() is not thread-safe.


git-svn-id: file:///srv/svn/repos/haiku/trunk/current@2439 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Axel Dörfler
2003-01-12 17:15:17 +00:00
parent eadb1c453a
commit 7dce97278f
+43 -12
View File
@@ -1,36 +1,67 @@
/* /*
** Copyright 2003, Axel Dörfler, [email protected]. All rights reserved.
** Copyright 2002, Manuel J. Petit. All rights reserved. ** Copyright 2002, Manuel J. Petit. All rights reserved.
** Distributed under the terms of the NewOS License. ** Distributed under the terms of the NewOS License.
*/ */
#include <dlfcn.h> #include <dlfcn.h>
#include <syscalls.h> #include <string.h>
#include <user_runtime.h> #include "user_runtime.h"
void __init__dlfcn(struct uspace_program_args const *);
static struct rld_export const *gRuntimeLinker;
static status_t gStatus;
void __init__dlfcn(struct uspace_prog_args_t const *);
static struct rld_export_t const *rld;
void * void *
dlopen(char const *name, unsigned flags) dlopen(char const *name, int mode)
{ {
return (void*)(rld->dl_open(name, flags)); if (name == NULL)
name = MAGIC_APP_NAME;
gStatus = gRuntimeLinker->load_add_on(name, mode);
if (gStatus < B_OK)
return NULL;
return (void *)gStatus;
} }
void * void *
dlsym(void *img, char const *name) dlsym(void *handle, char const *name)
{ {
return rld->dl_sym((unsigned)img, name, 0); void *location;
gStatus = gRuntimeLinker->get_image_symbol((image_id)handle, name, B_SYMBOL_TYPE_ANY, &location);
if (gStatus < B_OK)
return NULL;
return location;
} }
int int
dlclose(void *img) dlclose(void *handle)
{ {
return rld->dl_close((unsigned)img, 0); return gRuntimeLinker->unload_add_on((image_id)handle);
}
char *
dlerror(void)
{
if (gStatus < B_OK)
return strerror(gStatus);
return NULL;
} }
void void
__init__dlfcn(struct uspace_prog_args_t const *uspa) __init__dlfcn(struct uspace_program_args const *args)
{ {
rld= uspa->rld_export; gRuntimeLinker = args->rld_export;
} }