Date: Sun, 21 Jan 2007 15:14:07 +0900 From: Norikatsu Shigemura <nork@FreeBSD.org> To: freebsd-hackers@FreeBSD.org Cc: Norikatsu Shigemura <nork@FreeBSD.org> Subject: Add GENERIC weak symbols to rtld like libc's ones Message-ID: <20070121151407.0ab3f928.nork@FreeBSD.org>
next in thread | raw e-mail | index | archive | help
[-- Attachment #1 --]
I made two patches for HEAD and RELENG_6 to add GENERIC weak symbols
to rtld like __foo, _foo and foo. How about these patches?
[-- Attachment #2 --]
Index: rtld.c
===================================================================
RCS file: /home/ncvs/src/libexec/rtld-elf/rtld.c,v
retrieving revision 1.120
diff -u -r1.120 rtld.c
--- rtld.c 9 Jan 2007 17:50:05 -0000 1.120
+++ rtld.c 21 Jan 2007 03:40:28 -0000
@@ -142,6 +142,23 @@
void r_debug_state(struct r_debug *, struct link_map *);
+extern int __dlclose(void *);
+extern int _dlclose(void *);
+extern const char *__dlerror(void);
+extern const char *_dlerror(void);
+extern void *__dlopen(const char *, int);
+extern void *_dlopen(const char *, int);
+extern void *__dlsym(void * __restrict, const char * __restrict);
+extern void *_dlsym(void * __restrict, const char * __restrict);
+extern int __dladdr(const void * __restrict, Dl_info * __restrict);
+extern int _dladdr(const void * __restrict, Dl_info * __restrict);
+extern void __dllockinit(void *, void *(*)(void *), void (*)(void *), void (*)(void *), void (*)(void *), void (*)(void *), void (*)(void *));
+extern void _dllockinit(void *, void *(*)(void *), void (*)(void *), void (*)(void *), void (*)(void *), void (*)(void *), void (*)(void *));
+extern int __dlinfo(void * __restrict, int, void * __restrict);
+extern int _dlinfo(void * __restrict, int, void * __restrict);
+extern void *__dlvsym(void * __restrict, const char * __restrict, const char * __restrict);
+extern void *_dlvsym(void * __restrict, const char * __restrict, const char * __restrict);
+
/*
* Data declarations.
*/
@@ -189,13 +206,29 @@
*/
static func_ptr_type exports[] = {
(func_ptr_type) &_rtld_error,
+ (func_ptr_type) &__dlclose,
+ (func_ptr_type) &_dlclose,
(func_ptr_type) &dlclose,
+ (func_ptr_type) &__dlerror,
+ (func_ptr_type) &_dlerror,
(func_ptr_type) &dlerror,
+ (func_ptr_type) &__dlopen,
+ (func_ptr_type) &_dlopen,
(func_ptr_type) &dlopen,
+ (func_ptr_type) &__dlsym,
+ (func_ptr_type) &_dlsym,
(func_ptr_type) &dlsym,
+ (func_ptr_type) &__dlvsym,
+ (func_ptr_type) &_dlvsym,
(func_ptr_type) &dlvsym,
+ (func_ptr_type) &__dladdr,
+ (func_ptr_type) &_dladdr,
(func_ptr_type) &dladdr,
+ (func_ptr_type) &__dllockinit,
+ (func_ptr_type) &_dllockinit,
(func_ptr_type) &dllockinit,
+ (func_ptr_type) &__dlinfo,
+ (func_ptr_type) &_dlinfo,
(func_ptr_type) &dlinfo,
(func_ptr_type) &_rtld_thread_init,
#ifdef __i386__
@@ -1724,7 +1757,7 @@
}
int
-dlclose(void *handle)
+__dlclose(void *handle)
{
Obj_Entry *root;
int lockstate;
@@ -1762,20 +1795,24 @@
wlock_release(rtld_bind_lock, lockstate);
return 0;
}
+__weak_reference(__dlclose, dlclose);
+__weak_reference(__dlclose, _dlclose);
const char *
-dlerror(void)
+__dlerror(void)
{
char *msg = error_message;
error_message = NULL;
return msg;
}
+__weak_reference(__dlerror, dlerror);
+__weak_reference(__dlerror, _dlerror);
/*
* This function is deprecated and has no effect.
*/
void
-dllockinit(void *context,
+__dllockinit(void *context,
void *(*lock_create)(void *context),
void (*rlock_acquire)(void *lock),
void (*wlock_acquire)(void *lock),
@@ -1792,9 +1829,11 @@
cur_context = context;
cur_context_destroy = context_destroy;
}
+__weak_reference(__dllockinit, dllockinit);
+__weak_reference(__dllockinit, _dllockinit);
void *
-dlopen(const char *name, int mode)
+__dlopen(const char *name, int mode)
{
Obj_Entry **old_obj_tail;
Obj_Entry *obj;
@@ -1870,6 +1909,8 @@
wlock_release(rtld_bind_lock, lockstate);
exit(0);
}
+__weak_reference(__dlopen, dlopen);
+__weak_reference(__dlopen, _dlopen);
static void *
do_dlsym(void *handle, const char *name, void *retaddr, const Ver_Entry *ve,
@@ -1958,14 +1999,16 @@
}
void *
-dlsym(void *handle, const char *name)
+__dlsym(void *handle, const char *name)
{
return do_dlsym(handle, name, __builtin_return_address(0), NULL,
SYMLOOK_DLSYM);
}
+__weak_reference(__dlsym, dlsym);
+__weak_reference(__dlsym, _dlsym);
void *
-dlvsym(void *handle, const char *name, const char *version)
+__dlvsym(void *handle, const char *name, const char *version)
{
Ver_Entry ventry;
@@ -1976,9 +2019,11 @@
return do_dlsym(handle, name, __builtin_return_address(0), &ventry,
SYMLOOK_DLSYM);
}
+__weak_reference(__dlvsym, dlvsym);
+__weak_reference(__dlvsym, _dlvsym);
int
-dladdr(const void *addr, Dl_info *info)
+__dladdr(const void *addr, Dl_info *info)
{
const Obj_Entry *obj;
const Elf_Sym *def;
@@ -2032,9 +2077,11 @@
rlock_release(rtld_bind_lock, lockstate);
return 1;
}
+__weak_reference(__dladdr, dladdr);
+__weak_reference(__dladdr, _dladdr);
int
-dlinfo(void *handle, int request, void *p)
+__dlinfo(void *handle, int request, void *p)
{
const Obj_Entry *obj;
int error, lockstate;
@@ -2078,6 +2125,8 @@
return (error);
}
+__weak_reference(__dlinfo, dlinfo);
+__weak_reference(__dlinfo, _dlinfo);
struct fill_search_info_args {
int request;
[-- Attachment #3 --]
Index: rtld.c
===================================================================
RCS file: /home/ncvs/src/libexec/rtld-elf/rtld.c,v
retrieving revision 1.106.2.4
diff -u -r1.106.2.4 rtld.c
--- rtld.c 16 Jan 2007 07:51:04 -0000 1.106.2.4
+++ rtld.c 21 Jan 2007 03:40:48 -0000
@@ -133,6 +133,21 @@
void r_debug_state(struct r_debug *, struct link_map *);
+extern int __dlclose(void *);
+extern int _dlclose(void *);
+extern const char *__dlerror(void);
+extern const char *_dlerror(void);
+extern void *__dlopen(const char *, int);
+extern void *_dlopen(const char *, int);
+extern void *__dlsym(void * __restrict, const char * __restrict);
+extern void *_dlsym(void * __restrict, const char * __restrict);
+extern int __dladdr(const void * __restrict, Dl_info * __restrict);
+extern int _dladdr(const void * __restrict, Dl_info * __restrict);
+extern void __dllockinit(void *, void *(*)(void *), void (*)(void *), void (*)(void *), void (*)(void *), void (*)(void *), void (*)(void *));
+extern void _dllockinit(void *, void *(*)(void *), void (*)(void *), void (*)(void *), void (*)(void *), void (*)(void *), void (*)(void *));
+extern int __dlinfo(void * __restrict, int, void * __restrict);
+extern int _dlinfo(void * __restrict, int, void * __restrict);
+
/*
* Data declarations.
*/
@@ -179,12 +194,26 @@
*/
static func_ptr_type exports[] = {
(func_ptr_type) &_rtld_error,
+ (func_ptr_type) &__dlclose,
+ (func_ptr_type) &_dlclose,
(func_ptr_type) &dlclose,
+ (func_ptr_type) &__dlerror,
+ (func_ptr_type) &_dlerror,
(func_ptr_type) &dlerror,
+ (func_ptr_type) &__dlopen,
+ (func_ptr_type) &_dlopen,
(func_ptr_type) &dlopen,
+ (func_ptr_type) &__dlsym,
+ (func_ptr_type) &_dlsym,
(func_ptr_type) &dlsym,
+ (func_ptr_type) &__dladdr,
+ (func_ptr_type) &_dladdr,
(func_ptr_type) &dladdr,
+ (func_ptr_type) &__dllockinit,
+ (func_ptr_type) &_dllockinit,
(func_ptr_type) &dllockinit,
+ (func_ptr_type) &__dlinfo,
+ (func_ptr_type) &_dlinfo,
(func_ptr_type) &dlinfo,
(func_ptr_type) &_rtld_thread_init,
#ifdef __i386__
@@ -1621,7 +1650,7 @@
}
int
-dlclose(void *handle)
+__dlclose(void *handle)
{
Obj_Entry *root;
int lockstate;
@@ -1656,20 +1685,24 @@
wlock_release(rtld_bind_lock, lockstate);
return 0;
}
+__weak_reference(__dlclose, dlclose);
+__weak_reference(__dlclose, _dlclose);
const char *
-dlerror(void)
+__dlerror(void)
{
char *msg = error_message;
error_message = NULL;
return msg;
}
+__weak_reference(__dlerror, dlerror);
+__weak_reference(__dlerror, _dlerror);
/*
* This function is deprecated and has no effect.
*/
void
-dllockinit(void *context,
+__dllockinit(void *context,
void *(*lock_create)(void *context),
void (*rlock_acquire)(void *lock),
void (*wlock_acquire)(void *lock),
@@ -1686,9 +1719,11 @@
cur_context = context;
cur_context_destroy = context_destroy;
}
+__weak_reference(__dllockinit, dllockinit);
+__weak_reference(__dllockinit, _dllockinit);
void *
-dlopen(const char *name, int mode)
+__dlopen(const char *name, int mode)
{
Obj_Entry **old_obj_tail;
Obj_Entry *obj;
@@ -1763,9 +1798,11 @@
wlock_release(rtld_bind_lock, lockstate);
exit(0);
}
+__weak_reference(__dlopen, dlopen);
+__weak_reference(__dlopen, _dlopen);
void *
-dlsym(void *handle, const char *name)
+__dlsym(void *handle, const char *name)
{
DoneList donelist;
const Obj_Entry *obj, *defobj;
@@ -1849,9 +1886,11 @@
rlock_release(rtld_bind_lock, lockstate);
return NULL;
}
+__weak_reference(__dlsym, dlsym);
+__weak_reference(__dlsym, _dlsym);
int
-dladdr(const void *addr, Dl_info *info)
+__dladdr(const void *addr, Dl_info *info)
{
const Obj_Entry *obj;
const Elf_Sym *def;
@@ -1905,9 +1944,11 @@
rlock_release(rtld_bind_lock, lockstate);
return 1;
}
+__weak_reference(__dladdr, dladdr);
+__weak_reference(__dladdr, _dladdr);
int
-dlinfo(void *handle, int request, void *p)
+__dlinfo(void *handle, int request, void *p)
{
const Obj_Entry *obj;
int error, lockstate;
@@ -1951,6 +1992,8 @@
return (error);
}
+__weak_reference(__dlinfo, dlinfo);
+__weak_reference(__dlinfo, _dlinfo);
struct fill_search_info_args {
int request;
@@ -2877,3 +2920,10 @@
free_tls(tcb, tcbsize, tcbalign);
wlock_release(rtld_bind_lock, lockstate);
}
+
+
+
+
+
+
+
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20070121151407.0ab3f928.nork>
