diff options
author | Michele Calgaro <[email protected]> | 2018-06-16 21:45:03 +0900 |
---|---|---|
committer | Michele Calgaro <[email protected]> | 2018-06-16 21:45:03 +0900 |
commit | af8244e3e02690e251d24f38abbb1e7742250758 (patch) | |
tree | 732b9f2b56fbd801919d8f28933441d6ca48463d | |
parent | 7080e95da6d4c653cb208c55cac2d3a31ff6d652 (diff) | |
download | kgtk-qt3-af8244e3e02690e251d24f38abbb1e7742250758.tar.gz kgtk-qt3-af8244e3e02690e251d24f38abbb1e7742250758.zip |
Fixed problem with dlsym lookup. This resolve bug 2477.
Partially inspired by posts at
https://stackoverflow.com/questions/15599026/how-can-i-intercept-dlsym-calls-using-ld-preload
Signed-off-by: Michele Calgaro <[email protected]>
-rw-r--r-- | gtk2/kgtk2.c | 63 | ||||
-rw-r--r-- | tqt/kqt3.cpp | 32 |
2 files changed, 44 insertions, 51 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 diff --git a/tqt/kqt3.cpp b/tqt/kqt3.cpp index 8ceb265..97b3584 100644 --- a/tqt/kqt3.cpp +++ b/tqt/kqt3.cpp @@ -120,19 +120,25 @@ static const char * getAppName(bool useTQt=true) int TQApplication::exec() { - static bool init=false; - - if(!init) - { - connectToKDialogD(getAppName(false)); - init=true; - } - - static int (*realFunction)(void *); - - if(!realFunction) - realFunction = (int (*)(void *)) dlsym(RTLD_NEXT, KQT_QAPPLICATION_EXEC); - return (int)realFunction(this); + static bool init=false; + + if(!init) + { + connectToKDialogD(getAppName(false)); + init=true; + } + + static int (*realFunction)(void *); + + if(!realFunction) + realFunction = (int (*)(void *)) dlsym(RTLD_NEXT, KQT_QAPPLICATION_EXEC); + if (realFunction) + return (int)realFunction(this); + else + { + tqWarning("kgtk-qt3 tqt TQApplication::exec() realFunction not found!!"); + return 255; + } }; static TQString qt2KdeFilter(const TQString &f) |