Skip site navigation (1)Skip section navigation (2)
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>