-        // under Linux, we can get location of the executable
-        char buf[4096];
-        if ( readlink("/proc/self/exe", buf, WXSIZEOF(buf)) != -1 )
-        {
-            wxString exe(buf, wxConvLibc);
-
-            // consider that we're in the last "bin" subdirectory of our prefix
-            wxString basename(wxString(wxTheApp->argv[0]).AfterLast(_T('/')));
-            size_t pos = exe.find(_T("/bin/") + basename);
-            if ( pos != wxString::npos )
-            {
-                self->m_prefix.assign(exe, 0, pos);
-            }
-        }
-
-        if ( m_prefix.empty() )
+    wxString exeStr;
+
+    char buf[4096];
+    int result = readlink("/proc/self/exe", buf, WXSIZEOF(buf) - sizeof(char));
+    if ( result != -1 )
+    {
+        buf[result] = '\0'; // readlink() doesn't NUL-terminate the buffer
+
+        // if the /proc/self/exe symlink has been dropped by the kernel for
+        // some reason, then readlink() could also return success but
+        // "(deleted)" as link destination...
+        if ( strcmp(buf, "(deleted)") != 0 )
+            exeStr = wxString(buf, wxConvLibc);
+    }
+
+    if ( exeStr.empty() )
+    {
+        // UPX-specific hack: when using UPX on linux, the kernel will drop the
+        // /proc/self/exe link; in this case we try to look for a special
+        // environment variable called "   " which is created by UPX to save
+        // /proc/self/exe contents. See
+        //      http://sf.net/tracker/?func=detail&atid=309863&aid=1565357&group_id=9863
+        // for more information about this issue.
+        wxGetEnv(wxT("   "), &exeStr);
+    }
+
+    if ( !exeStr.empty() )
+        return exeStr;