summarylogtreecommitdiffstats
path: root/200_libc_symbol_versioning.diff
blob: 0769e857279f5b47964ef0958efd2b773bbca01c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
Index: zzuf-0.13.svn20100215/src/libzzuf/lib-load.h
===================================================================
--- zzuf-0.13.svn20100215.orig/src/libzzuf/lib-load.h	2010-01-13 02:16:46.000000000 +0100
+++ zzuf-0.13.svn20100215/src/libzzuf/lib-load.h	2012-04-17 01:26:49.068253763 +0200
@@ -20,6 +20,7 @@
 
 #ifdef HAVE_DLFCN_H
 #   include <dlfcn.h>
+extern void *_zz_dl_lib;
 #   define NEW(x) x
 #   define LOADSYM(x) \
         do { \
@@ -29,7 +30,7 @@
                  * otherwise we may miss a lot of stuff if we wait for \
                  * the linker to load us fully. */ \
                 _zz_init(); \
-                ORIG(x) = dlsym(RTLD_NEXT, STR(x)); \
+                ORIG(x) = dlsym(_zz_dl_lib, STR(x)); \
             } \
             if(!ORIG(x)) \
                 abort(); \
Index: zzuf-0.13.svn20100215/src/libzzuf/sys.c
===================================================================
--- zzuf-0.13.svn20100215.orig/src/libzzuf/sys.c	2010-01-13 02:16:46.000000000 +0100
+++ zzuf-0.13.svn20100215/src/libzzuf/sys.c	2012-04-17 01:26:35.476253559 +0200
@@ -16,12 +16,19 @@
 
 #include "config.h"
 
+/* Need this for RTLD_NEXT */
+#define _GNU_SOURCE
+
 #if defined HAVE_STDINT_H
 #   include <stdint.h>
 #elif defined HAVE_INTTYPES_H
 #   include <inttypes.h>
 #endif
 
+#ifdef HAVE_DLFCN_H
+#   include <dlfcn.h>
+#endif
+
 #if defined HAVE_WINDOWS_H
 #   include <windows.h>
 #   include <imagehlp.h>
@@ -34,6 +41,10 @@
 
 #include "sys.h"
 
+#if defined HAVE_DLFCN_H
+void *_zz_dl_lib = RTLD_NEXT;
+#endif
+
 #if defined HAVE_WINDOWS_H
 static void insert_func(void *, void *, void *);
 
@@ -71,6 +82,20 @@
         insert_func(entry.hModule, LoadLibraryA_orig, LoadLibraryA_new);
     }
     CloseHandle(list);
+#elif defined HAVE_DLFCN_H
+    /* If glibc is recent enough, we use dladdr() to get its address. This
+     * way we are sure that the symbols we load are the most recent version,
+     * or we may get weird problems. We choose fileno as a random symbol to
+     * get, because we know we don't divert it. */
+#   if HAVE_DLADDR
+    Dl_info di;
+    if (dladdr(&fileno, &di) != 0)
+    {
+        void *lib = dlopen(di.dli_fname, RTLD_NOW);
+        if (lib)
+            _zz_dl_lib = lib;
+    }
+#   endif
 #else
     /* Nothing to do on our platform */
 #endif