-        // under Linux, we can get location of the executable
-        wxChar buf[4096];
-        int result;
-
-        // FIXME: is readlink() Unicode-aware or not???
-        result = readlink( (const char*)wxT("/proc/self/exe"), buf, WXSIZEOF(buf) - sizeof(wxChar) );
-        if (result != -1)
-        {
-            buf[result] = wxChar(0);
-            wxString exeStr( buf, wxConvLibc );
-
-            // consider that we're in the last "bin" subdirectory of our prefix
-            wxString basename( wxString( wxTheApp->argv[0]).AfterLast( wxChar('/')) );
-            size_t pos = exeStr.find( wxT("/bin/") + basename );
-            if (pos != wxString::npos)
-                pathPtr->m_prefix.assign( exeStr, 0, pos );
-        }
+    // under Linux, we can try to infer the prefix from the location of the
+    // executable
+    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() )
+    {
+        // consider that we're in the last "bin" subdirectory of our prefix
+        size_t pos = exeStr.rfind(wxT("/bin/"));
+        if ( pos != wxString::npos )
+            m_prefix.assign(exeStr, 0, pos);
+    }