Index: /trunk/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp
===================================================================
--- /trunk/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp	(revision 25557)
+++ /trunk/src/VBox/HostDrivers/Support/SUPR3HardenedMain.cpp	(revision 25558)
@@ -141,4 +141,5 @@
 #endif
 
+
 /*******************************************************************************
 *   Internal Functions                                                         *
@@ -324,12 +325,12 @@
 # ifdef RT_OS_LINUX
     int cchLink = readlink("/proc/self/exe", &g_szSupLibHardenedExePath[0], sizeof(g_szSupLibHardenedExePath) - 1);
+
 # elif defined(RT_OS_SOLARIS)
     char szFileBuf[PATH_MAX + 1];
     sprintf(szFileBuf, "/proc/%ld/path/a.out", (long)getpid());
     int cchLink = readlink(szFileBuf, &g_szSupLibHardenedExePath[0], sizeof(g_szSupLibHardenedExePath) - 1);
-# else /* RT_OS_FREEBSD: */
+
+# else /* RT_OS_FREEBSD */
     int aiName[4];
-    size_t cbPath;
-
     aiName[0] = CTL_KERN;
     aiName[1] = KERN_PROC;
@@ -337,9 +338,10 @@
     aiName[3] = getpid();
 
-    cbPath = sizeof(g_szSupLibHardenedExePath) - 1;
-    if(sysctl(aiName, RT_ELEMENTS(aiName), g_szSupLibHardenedExePath, &cbPath, NULL, 0) < 0)
-       supR3HardenedFatal("supR3HardenedExecDir: sysctl failed\n");
-
-    int cchLink = strlen(g_szSupLibHardenedExePath);
+    size_t cbPath = sizeof(g_szSupLibHardenedExePath);
+    if (sysctl(aiName, RT_ELEMENTS(aiName), g_szSupLibHardenedExePath, &cbPath, NULL, 0) < 0)
+        supR3HardenedFatal("supR3HardenedExecDir: sysctl failed\n");
+    g_szSupLibHardenedExePath[sizeof(g_szSupLibHardenedExePath) - 1] = '\0';
+    int cchLink = strlen(g_szSupLibHardenedExePath); /* paranoid? can't we use cbPath? */
+
 # endif
     if (cchLink < 0 || cchLink == sizeof(g_szSupLibHardenedExePath) - 1)
Index: /trunk/src/VBox/Runtime/VBox/log-vbox.cpp
===================================================================
--- /trunk/src/VBox/Runtime/VBox/log-vbox.cpp	(revision 25557)
+++ /trunk/src/VBox/Runtime/VBox/log-vbox.cpp	(revision 25558)
@@ -374,21 +374,17 @@
             fclose(pFile);
         }
+
 #  elif defined(RT_OS_FREEBSD)
-        char *pszArgFileBuf = NULL;
+        /* Retrieve the required length first */
         int aiName[4];
-        size_t cchArgs;
-
         aiName[0] = CTL_KERN;
         aiName[1] = KERN_PROC;
-        aiName[2] = KERN_PROC_ARGS;
-        aiName[3] = -1;
-
-        /* Retrieve the required length first */
-        cchArgs = 0;
+        aiName[2] = KERN_PROC_ARGS;     /* Introduced in FreeBSD 4.0 */
+        aiName[3] = getpid();
+        size_t cchArgs = 0;
         int rcBSD = sysctl(aiName, RT_ELEMENTS(aiName), NULL, &cchArgs, NULL, 0);
-
         if (cchArgs > 0)
         {
-            pszArgFileBuf = (char *)RTMemAllocZ(cchArgs + 1 /* Safety */);
+            char *pszArgFileBuf = (char *)RTMemAllocZ(cchArgs + 1 /* Safety */);
             if (pszArgFileBuf)
             {
@@ -397,19 +393,20 @@
                 if (!rcBSD)
                 {
-                    /*
-                     * cmdline is a flattened argument list so we need
-                     * to convert all \0 to blanks
-                     */
-                    for(size_t i = 0; i < cchArgs - 1; i++)
+                    unsigned    iArg = 0;
+                    size_t      off = 0;
+                    while (off < cchArgs)
                     {
-                       if(pszArgFileBuf[i] == '\0')
-                          pszArgFileBuf[i] = ' ';
+                        size_t cchArg = strlen(&pszArgFileBuf[off]);
+                        RTLogLoggerEx(pLogger, 0, ~0U, "Arg[%u]: %s\n", iArg, &pszArgFileBuf[off]);
+
+                        /* advance */
+                        off += cchArg + 1;
+                        iArg++;
                     }
-
-                    RTLogLoggerEx(pLogger, 0, ~0U, "Commandline: %s\n", pszArgFileBuf);
                 }
                 RTMemFree(pszArgFileBuf);
             }
         }
+
 #  elif defined(RT_OS_L4) || defined(RT_OS_OS2) || defined(RT_OS_DARWIN)
         /* commandline? */
Index: /trunk/src/VBox/Runtime/r3/freebsd/rtProcInitExePath-freebsd.cpp
===================================================================
--- /trunk/src/VBox/Runtime/r3/freebsd/rtProcInitExePath-freebsd.cpp	(revision 25557)
+++ /trunk/src/VBox/Runtime/r3/freebsd/rtProcInitExePath-freebsd.cpp	(revision 25558)
@@ -50,18 +50,18 @@
 DECLHIDDEN(int) rtProcInitExePath(char *pszPath, size_t cchPath)
 {
+#ifdef KERN_PROC_PATHNAME
     int aiName[4];
-    size_t cchExePath;
-
     aiName[0] = CTL_KERN;
     aiName[1] = KERN_PROC;
-    aiName[2] = KERN_PROC_PATHNAME;
-    aiName[3] = getpid();
+    aiName[2] = KERN_PROC_PATHNAME;     /* This was introduced in FreeBSD 6.0, thus the #ifdef above. */
+    aiName[3] = -1;                     /* Shorthand for the current process. */
 
-    cchExePath = cchPath - 1;
-    if(sysctl(aiName, RT_ELEMENTS(aiName), pszPath, &cchExePath, NULL, 0) == 0)
+    size_t cchExePath = cchPath;
+    if (sysctl(aiName, RT_ELEMENTS(aiName), pszPath, &cchExePath, NULL, 0) == 0)
     {
+
         char *pszTmp = NULL;
         int rc = rtPathFromNative(&pszTmp, pszPath);
-        AssertMsgRCReturn(rc, ("rc=%Rrc pszLink=\"%s\"\nhex: %.*Rhsx\n", rc, pszPath, cchExePath, pszPath), rc);
+        AssertMsgRCReturn(rc, ("rc=%Rrc pszPath=\"%s\"\nhex: %.*Rhsx\n", rc, pszPath, cchExePath, pszPath), rc);
 
         size_t cch = strlen(pszTmp);
@@ -75,6 +75,65 @@
 
     int rc = RTErrConvertFromErrno(errno);
-    AssertMsgFailed(("rc=%Rrc errno=%d cchLink=%d\n", rc, errno, cchExePath));
+    AssertMsgFailed(("rc=%Rrc errno=%d cchExePath=%d\n", rc, errno, cchExePath));
     return rc;
+
+#else
+
+    /*
+     * Read the /proc/curproc/file link, convert to native and return it.
+     */
+    int cchLink = readlink("/proc/curproc/file", pszPath, cchPath - 1);
+    if (cchLink > 0 && (size_t)cchLink <= cchPath - 1)
+    {
+        pszPath[cchLink] = '\0';
+
+        char *pszTmp = NULL;
+        int rc = rtPathFromNative(&pszTmp, pszPath);
+        AssertMsgRCReturn(rc, ("rc=%Rrc pszLink=\"%s\"\nhex: %.*Rhsx\n", rc, pszPath, cchLink, pszPath), rc);
+
+        size_t cch = strlen(pszTmp);
+        AssertReturn(cch <= cchPath, VERR_BUFFER_OVERFLOW);
+
+        memcpy(pszPath, pszTmp, cch + 1);
+        RTStrFree(pszTmp);
+
+        return VINF_SUCCESS;
+    }
+
+    int err = errno;
+
+    /*
+     * Fall back on the dynamic linker since /proc is optional.
+     */
+    void *hExe = dlopen(NULL, 0);
+    if (hExe)
+    {
+        struct link_map const *pLinkMap = 0;
+        if (dlinfo(hExe, RTLD_DI_LINKMAP, &pLinkMap) == 0)
+        {
+            const char *pszImageName = pLinkMap->l_name;
+            if (*pszImageName == '/') /* this may not always be absolute, despite the docs. :-( */
+            {
+                char *pszTmp = NULL;
+                int rc = rtPathFromNative(&pszTmp, pszImageName);
+                AssertMsgRCReturn(rc, ("rc=%Rrc pszImageName=\"%s\"\n", rc, pszImageName), rc);
+
+                size_t cch = strlen(pszTmp);
+                AssertReturn(cch <= cchPath, VERR_BUFFER_OVERFLOW);
+
+                memcpy(pszPath, pszTmp, cch + 1);
+                RTStrFree(pszTmp);
+
+                return VINF_SUCCESS;
+            }
+            /** @todo Try search the PATH for the file name or append the current
+             *        directory, which ever makes sense... */
+        }
+    }
+
+    int rc = RTErrConvertFromErrno(err);
+    AssertMsgFailed(("rc=%Rrc err=%d cchLink=%d hExe=%p\n", rc, err, cchLink, hExe));
+    return rc;
+#endif
 }
 
