Index: trunk/src/VBox/Runtime/common/dbg/dbgas.cpp
===================================================================
--- trunk/src/VBox/Runtime/common/dbg/dbgas.cpp	(revision 46215)
+++ trunk/src/VBox/Runtime/common/dbg/dbgas.cpp	(revision 46221)
@@ -1304,4 +1304,35 @@
 
 /**
+ * Creates a snapshot of the module table on the temporary heap.
+ *
+ * The caller must release all the module handles before freeing the table
+ * using RTMemTmpFree.
+ *
+ * @returns Module table snaphot.
+ * @param   pDbgAs          The address space instance data.
+ * @param   pcModules       Where to return the number of modules.
+ */
+static PRTDBGMOD rtDbgAsSnapshotModuleTable(PRTDBGASINT pDbgAs, uint32_t *pcModules)
+{
+    RTDBGAS_LOCK_READ(pDbgAs);
+
+    uint32_t iMod = *pcModules = pDbgAs->cModules;
+    PRTDBGMOD pahModules = (PRTDBGMOD)RTMemTmpAlloc(sizeof(pahModules[0]) * RT_MAX(iMod, 1));
+    if (pahModules)
+    {
+        while (iMod-- > 0)
+        {
+            RTDBGMOD hMod = (RTDBGMOD)pDbgAs->papModules[iMod]->Core.Key;
+            pahModules[iMod] = hMod;
+            RTDbgModRetain(hMod);
+        }
+    }
+
+    RTDBGAS_UNLOCK_READ(pDbgAs);
+    return pahModules;
+}
+
+
+/**
  * Query a symbol by address.
  *
@@ -1327,4 +1358,6 @@
     PRTDBGASINT pDbgAs = hDbgAs;
     RTDBGAS_VALID_RETURN_RC(pDbgAs, VERR_INVALID_HANDLE);
+    if (phMod)
+        *phMod = NIL_RTDBGMOD;
 
     RTDBGSEGIDX iSeg    = NIL_RTDBGSEGIDX; /* shut up gcc */
@@ -1334,7 +1367,43 @@
     if (hMod == NIL_RTDBGMOD)
     {
-        if (phMod)
-            *phMod = NIL_RTDBGMOD;
-        return VERR_NOT_FOUND;
+        /*
+         * Check for absolute symbols.  Requires iterating all modules.
+         */
+        uint32_t cModules;
+        PRTDBGMOD pahModules = rtDbgAsSnapshotModuleTable(pDbgAs, &cModules);
+        if (!pahModules)
+            return VERR_NO_TMP_MEMORY;
+
+        int      rc;
+        RTINTPTR offBestDisp = RTINTPTR_MAX;
+        uint32_t iBest       = UINT32_MAX;
+        for (uint32_t i = 0; i < cModules; i++)
+        {
+            RTINTPTR offDisp;
+            rc = RTDbgModSymbolByAddr(pahModules[i], RTDBGSEGIDX_ABS, Addr, fFlags, &offDisp, pSymbol);
+            if (RT_SUCCESS(rc) && RT_ABS(offDisp) < offBestDisp)
+            {
+                offBestDisp = RT_ABS(offDisp);
+                iBest = i;
+            }
+        }
+
+        if (iBest == UINT32_MAX)
+            rc = VERR_NOT_FOUND;
+        else
+        {
+            rc = RTDbgModSymbolByAddr(pahModules[iBest], RTDBGSEGIDX_ABS, Addr, fFlags, poffDisp, pSymbol);
+            if (RT_SUCCESS(rc))
+            {
+                rtDbgAsAdjustSymbolValue(pSymbol, hMod, MapAddr, iSeg);
+                if (phMod)
+                    RTDbgModRetain(*phMod = pahModules[iBest]);
+            }
+        }
+
+        for (uint32_t i = 0; i < cModules; i++)
+            RTDbgModRelease(pahModules[i]);
+        RTMemTmpFree(pahModules);
+        return rc;
     }
 
@@ -1404,35 +1473,4 @@
 }
 RT_EXPORT_SYMBOL(RTDbgAsSymbolByAddrA);
-
-
-/**
- * Creates a snapshot of the module table on the temporary heap.
- *
- * The caller must release all the module handles before freeing the table
- * using RTMemTmpFree.
- *
- * @returns Module table snaphot.
- * @param   pDbgAs          The address space instance data.
- * @param   pcModules       Where to return the number of modules.
- */
-DECLINLINE(PRTDBGMOD) rtDbgAsSnapshotModuleTable(PRTDBGASINT pDbgAs, uint32_t *pcModules)
-{
-    RTDBGAS_LOCK_READ(pDbgAs);
-
-    uint32_t iMod = *pcModules = pDbgAs->cModules;
-    PRTDBGMOD pahModules = (PRTDBGMOD)RTMemTmpAlloc(sizeof(pahModules[0]) * RT_MAX(iMod, 1));
-    if (pahModules)
-    {
-        while (iMod-- > 0)
-        {
-            RTDBGMOD hMod = (RTDBGMOD)pDbgAs->papModules[iMod]->Core.Key;
-            pahModules[iMod] = hMod;
-            RTDbgModRetain(hMod);
-        }
-    }
-
-    RTDBGAS_UNLOCK_READ(pDbgAs);
-    return pahModules;
-}
 
 
