move static-linked stub dlsym out of dynlink.c
authorRich Felker <dalias@aerifal.cx>
Tue, 26 Jan 2016 00:01:22 +0000 (19:01 -0500)
committerRich Felker <dalias@aerifal.cx>
Tue, 26 Jan 2016 00:04:45 +0000 (19:04 -0500)
the function name is still __-prefixed because it requires an asm
wrapper to pass the caller's address in order for RTLD_NEXT to work.

since this was the last function in dynlink.c still used for static
linking, now the whole file is conditional on SHARED being defined.

src/ldso/__dlsym.c [new file with mode: 0644]
src/ldso/dynlink.c

diff --git a/src/ldso/__dlsym.c b/src/ldso/__dlsym.c
new file mode 100644 (file)
index 0000000..99aafdf
--- /dev/null
@@ -0,0 +1,13 @@
+#include <dlfcn.h>
+#include "libc.h"
+
+__attribute__((__visibility__("hidden")))
+void __dl_seterr(const char *, ...);
+
+static void *stub_dlsym(void *restrict p, const char *restrict s, void *restrict ra)
+{
+       __dl_seterr("Symbol not found: %s", s);
+       return 0;
+}
+
+weak_alias(stub_dlsym, __dlsym);
index 43f86fa37a0455d649fbbb648b3fbc9b9e3253a4..e328679b877e913710de7cd0b353296e9eb36864 100644 (file)
@@ -1,3 +1,4 @@
+#ifdef SHARED
 #define _GNU_SOURCE
 #include <stdio.h>
 #include <stdlib.h>
@@ -23,8 +24,6 @@
 
 static void error(const char *, ...);
 
-#ifdef SHARED
-
 #define MAXP2(a,b) (-(-(a)&-(b)))
 #define ALIGN(x,y) ((x)+(y)-1 & -(y))
 
@@ -1913,13 +1912,6 @@ int dl_iterate_phdr(int(*callback)(struct dl_phdr_info *info, size_t size, void
        }
        return ret;
 }
-#else
-void *__dlsym(void *restrict p, const char *restrict s, void *restrict ra)
-{
-       error("Symbol not found: %s", s);
-       return 0;
-}
-#endif
 
 __attribute__((__visibility__("hidden")))
 void __dl_vseterr(const char *, va_list);
@@ -1928,7 +1920,6 @@ static void error(const char *fmt, ...)
 {
        va_list ap;
        va_start(ap, fmt);
-#ifdef SHARED
        if (!runtime) {
                vdprintf(2, fmt, ap);
                dprintf(2, "\n");
@@ -1936,7 +1927,7 @@ static void error(const char *fmt, ...)
                va_end(ap);
                return;
        }
-#endif
        __dl_vseterr(fmt, ap);
        va_end(ap);
 }
+#endif