Code drop from //branches/cupcake/...@124589
diff --git a/linker/debugger.c b/linker/debugger.c
index 68997c5..542cf8d 100644
--- a/linker/debugger.c
+++ b/linker/debugger.c
@@ -16,20 +16,20 @@
 {
     unsigned tid;
     int s;
-           
-        /* avoid picking up GC interrupts */
+
+    /* avoid picking up GC interrupts */
     signal(SIGUSR1, SIG_IGN);
-    
+
     tid = gettid();
     s = socket_local_client("android:debuggerd", 
             ANDROID_SOCKET_NAMESPACE_ABSTRACT, SOCK_STREAM);
-    
+
     if(s >= 0) {
-            /* debugger knows our pid from the credentials on the
-            ** local socket but we need to tell it our tid.  It
-            ** is paranoid and will verify that we are giving a tid
-            ** that's actually in our process
-            */
+        /* debugger knows our pid from the credentials on the
+         * local socket but we need to tell it our tid.  It
+         * is paranoid and will verify that we are giving a tid
+         * that's actually in our process
+         */
         write(s, &tid, sizeof(unsigned));
 
         read(s, &tid, 1);
@@ -37,7 +37,7 @@
         close(s);
     }
 
-        /* remove our net so we fault for real when we return */
+    /* remove our net so we fault for real when we return */
     signal(n, SIG_IGN);
 }
 
diff --git a/linker/linker.c b/linker/linker.c
index 88e3ea2..34ed80e 100644
--- a/linker/linker.c
+++ b/linker/linker.c
@@ -7,6 +7,7 @@
 #include <fcntl.h>
 #include <errno.h>
 #include <dlfcn.h>
+#include <sys/stat.h>
 
 //#include <pthread.h>
 
@@ -409,6 +410,21 @@
     0
 };
 
+static int _open_lib(const char *name)
+{
+    int fd;
+    struct stat filestat;
+
+    if ((stat(name, &filestat) >= 0) && S_ISREG(filestat.st_mode)) {
+        if ((fd = open(name, O_RDONLY)) >= 0)
+            return fd;
+    }
+
+    return -1;
+}
+
+/* TODO: Need to add support for initializing the so search path with
+ * LD_LIBRARY_PATH env variable for non-setuid programs. */
 static int open_library(const char *name)
 {
     int fd;
@@ -417,16 +433,16 @@
 
     TRACE("[ %5d opening %s ]\n", pid, name);
 
-    if(strlen(name) > 256) return -1;
     if(name == 0) return -1;
+    if(strlen(name) > 256) return -1;
 
-    fd = open(name, O_RDONLY);
-    if(fd != -1) return fd;
+    if ((name[0] == '/') && ((fd = _open_lib(name)) >= 0))
+        return fd;
 
-    for(path = sopaths; *path; path++){
-        sprintf(buf,"%s/%s", *path, name);
-        fd = open(buf, O_RDONLY);
-        if(fd != -1) return fd;
+    for (path = sopaths; *path; path++) {
+        snprintf(buf, sizeof(buf), "%s/%s", *path, name);
+        if ((fd = _open_lib(buf)) >= 0)
+            return fd;
     }
 
     return -1;
@@ -1026,7 +1042,7 @@
     }
     else {
         si->refcount--;
-        ERROR("%5d not unloading '%s', decrementing refcount to %d\n",
+        PRINT("%5d not unloading '%s', decrementing refcount to %d\n",
               pid, si->name, si->refcount);
     }
     return si->refcount;
diff --git a/linker/linker_debug.h b/linker/linker_debug.h
index 10ae7b1..fa2a1a1 100644
--- a/linker/linker_debug.h
+++ b/linker/linker_debug.h
@@ -27,15 +27,17 @@
 #define TRUE                 1
 #define FALSE                0
 
+
+#define __PRINTVF(v,f,x...)   do {                                        \
+        (debug_verbosity > (v)) && (printf(x), ((f) && fflush(stdout))); \
+    } while (0)
 /* Only use printf() during debugging.  We have seen occasional memory
  * corruption when the linker uses printf().
  */
 #if LINKER_DEBUG
 extern int debug_verbosity;
 #warning "*** LINKER IS USING printf(); DO NOT CHECK THIS IN ***"
-#define _PRINTVF(v,f,x...)   do {                                        \
-        (debug_verbosity > (v)) && (printf(x), ((f) && fflush(stdout))); \
-    } while (0)
+#define _PRINTVF(v,f,x...)    __PRINTVF(v,f,x)
 #else /* !LINKER_DEBUG */
 #define _PRINTVF(v,f,x...)   do {} while(0)
 #endif /* LINKER_DEBUG */
@@ -46,7 +48,7 @@
 #define WARN(fmt,args...)    \
         _PRINTVF(-1, TRUE, "%s:%d| WARNING: " fmt, __FILE__, __LINE__, ## args)
 #define ERROR(fmt,args...)   \
-        _PRINTVF(-1, TRUE, "%s:%d| ERROR: " fmt, __FILE__, __LINE__, ## args)
+        __PRINTVF(-1, TRUE, "%s:%d| ERROR: " fmt, __FILE__, __LINE__, ## args)
 
 #if TRACE_DEBUG
 #define DEBUG(x...)          _PRINTVF(2, TRUE, "DEBUG: " x)