diff options
author | Michele Calgaro <michele.calgaro@yahoo.it> | 2018-06-16 21:45:03 +0900 |
---|---|---|
committer | Michele Calgaro <michele.calgaro@yahoo.it> | 2018-06-16 21:49:26 +0900 |
commit | f63092c8af23b11d5a5470b67b40d27869b7b6ec (patch) | |
tree | c29d4567ed64d18d473487e18b88127bbe9bfc43 /gtk2 | |
parent | d3e9290f76b1eaf7b7cd45fb90f81b5c820d97dc (diff) | |
download | kgtk-qt3-f63092c8af23b11d5a5470b67b40d27869b7b6ec.tar.gz kgtk-qt3-f63092c8af23b11d5a5470b67b40d27869b7b6ec.zip |
Fixed problem with dlsym lookup. This resolve bug 2477.r14.0.5
Partially inspired by posts at
https://stackoverflow.com/questions/15599026/how-can-i-intercept-dlsym-calls-using-ld-preload
Signed-off-by: Michele Calgaro <michele.calgaro@yahoo.it>
(cherry picked from commit af8244e3e02690e251d24f38abbb1e7742250758)
Diffstat (limited to 'gtk2')
-rw-r--r-- | gtk2/kgtk2.c | 63 |
1 files changed, 25 insertions, 38 deletions
diff --git a/gtk2/kgtk2.c b/gtk2/kgtk2.c index 77d690b..3b4889e 100644 --- a/gtk2/kgtk2.c +++ b/gtk2/kgtk2.c @@ -67,10 +67,6 @@ TODO #include "connect.h" #include "config.h" -#ifndef KGTK_DLSYM_VERSION -#define KGTK_DLSYM_VERSION "GLIBC_2.0" -#endif - #define BLACKLIST_UNKNOWN_GTK_APPS 0 /* @@ -78,15 +74,10 @@ TODO */ /* - * For SWT apps (e.g. eclipse) we need to override dlsym, but we can only do this if - * dlvsym is present in libdl. dlvsym is needed so that we can access the real dlsym - * as well as our fake dlsym + * For SWT apps (e.g. eclipse) we need to override dlsym. */ -#ifdef HAVE_DLVSYM +extern void *_dl_sym(void *, const char *, void *); static void * real_dlsym (void *handle, const char *name); -#else -#define real_dlsym(A, B) dlsym(A, B) -#endif typedef enum { @@ -2241,41 +2232,38 @@ void * PR_FindFunctionSymbol(struct PR_LoadLibrary *lib, const char *raw_name) return NULL; } -#ifdef HAVE_DLVSYM /* Overriding dlsym is required for SWT - which dlsym's the gtk_file_chooser functions! */ static void * real_dlsym(void *handle, const char *name) { - static void * (*realFunction)() = NULL; - -#ifdef KGTK_DEBUG_DLSYM - printf("KGTK::real_dlsym : %s\n", name); -#endif - - if (!realFunction) - { - void *ldHandle=dlopen("libdl.so", RTLD_NOW); + static void * (*realFunction)() = NULL; #ifdef KGTK_DEBUG_DLSYM - printf("KGTK::real_dlsym : %s\n", name); -#endif - - if(ldHandle) - { - static const char * versions[]={KGTK_DLSYM_VERSION, "GLIBC_2.3", "GLIBC_2.2.5", - "GLIBC_2.2", "GLIBC_2.1", "GLIBC_2.0", NULL}; - - int i; - - for(i=0; versions[i] && !realFunction; ++i) - realFunction=dlvsym(ldHandle, "dlsym", versions[i]); - } - } - - return realFunction(handle, name); + printf("KGTK::real_dlsym : %s\n", name); +#endif + + if (!realFunction) + { + // Get the real dlsym function + realFunction = _dl_sym(RTLD_NEXT, "dlsym", dlsym); + } + + if (realFunction) + return realFunction(handle, name); + else + { + printf("kgtk-qt3 gtk2 real_dlsymc() realFunction not found!!\n"); + return NULL; + } } void * dlsym(void *handle, const char *name) { + // Need this so _dl_sym will be able to find the next dlsym, i.e. the real dlsym! + if (!strcmp(name, "dlsym")) + { + return (void*)dlsym; + } + void *rv=NULL; #ifdef KGTK_DEBUG_DLSYM @@ -2294,4 +2282,3 @@ void * dlsym(void *handle, const char *name) #endif return rv; } -#endif |