summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMichele Calgaro <[email protected]>2018-06-16 21:45:03 +0900
committerMichele Calgaro <[email protected]>2018-06-16 21:45:03 +0900
commitaf8244e3e02690e251d24f38abbb1e7742250758 (patch)
tree732b9f2b56fbd801919d8f28933441d6ca48463d
parent7080e95da6d4c653cb208c55cac2d3a31ff6d652 (diff)
downloadkgtk-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.c63
-rw-r--r--tqt/kqt3.cpp32
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)