OSDN Git Service

linker: Support dlopen(NULL, ...) properly.
authorDavid 'Digit' Turner <digit@google.com>
Wed, 21 Jul 2010 23:18:21 +0000 (16:18 -0700)
committerDavid 'Digit' Turner <digit@google.com>
Fri, 23 Jul 2010 19:16:15 +0000 (12:16 -0700)
Change-Id: Icba37823cb350c34848cc466d144c3a0af87c94c

libc/docs/CHANGES.TXT
linker/linker.c

index 96f25d3..d1d82de 100644 (file)
@@ -70,6 +70,8 @@ Differences between current and Android 2.2:
 - <sys/vfs.h>: fixed implementation of fstatfs() (also fixes fpathconf()
   which uses it).
 
+- <dlfcn.h>: fixed dlopen() implementation to support dlopen(NULL, ...).
+  This allows one to look at the dynamic symbols exported by an executable.
 
 -------------------------------------------------------------------------------
 Differences between Android 2.2. and Android 2.1:
index 5e04e24..89586eb 100644 (file)
@@ -1200,7 +1200,17 @@ init_library(soinfo *si)
 soinfo *find_library(const char *name)
 {
     soinfo *si;
-    const char *bname = strrchr(name, '/');
+    const char *bname;
+
+#if ALLOW_SYMBOLS_FROM_MAIN
+    if (name == NULL)
+        return somain;
+#else
+    if (name == NULL)
+        return NULL;
+#endif
+
+    bname = strrchr(name, '/');
     bname = bname ? bname + 1 : name;
 
     for(si = solist; si != 0; si = si->next){
@@ -2193,6 +2203,7 @@ unsigned __linker_init(unsigned **elfdata)
     si->dynamic = (unsigned *)-1;
     si->wrprotect_start = 0xffffffff;
     si->wrprotect_end = 0;
+    si->refcount = 1;
 
         /* Use LD_LIBRARY_PATH if we aren't setuid/setgid */
     if (ldpath_env && getuid() == geteuid() && getgid() == getegid())