Index: /trunk/src/VBox/Runtime/common/ldr/ldrMachO.cpp
===================================================================
--- /trunk/src/VBox/Runtime/common/ldr/ldrMachO.cpp	(revision 74855)
+++ /trunk/src/VBox/Runtime/common/ldr/ldrMachO.cpp	(revision 74856)
@@ -3636,5 +3636,8 @@
                                        + UINT64_C(0x80000000)
                                     >= UINT64_C(0xffffff20))
+                            {
+                                RTLDRMODMACHO_CHECK_RETURN(pThis->JmpStubsRVA != NIL_RTLDRADDR, VERR_LDR_ADDRESS_OVERFLOW);
                                 SymAddr += pThis->cbJmpStub * Fixup.r.r_symbolnum + pThis->JmpStubsRVA + NewBaseAddress;
+                            }
                             else
                                 SymAddr += pSym->n_value;
Index: /trunk/src/VBox/Runtime/testcase/tstLdr-3.cpp
===================================================================
--- /trunk/src/VBox/Runtime/testcase/tstLdr-3.cpp	(revision 74855)
+++ /trunk/src/VBox/Runtime/testcase/tstLdr-3.cpp	(revision 74856)
@@ -46,4 +46,5 @@
 static void     *g_pvBits;
 static uint8_t   g_cBits;
+static uint8_t   g_fNearImports;
 
 /**
@@ -215,10 +216,12 @@
 {
     RT_NOREF5(hLdrMod, pszModule, pszSymbol, uSymbol, pvUser);
-#if 1
     RTUINTPTR BaseAddr = *(PCRTUINTPTR)pvUser;
-    *pValue = BaseAddr + UINT32_C(0x604020f0);
-#else
-    *pValue = UINT64_C(0xffffff7f820df000);
-#endif
+    if (g_fNearImports)
+        *pValue = BaseAddr + UINT32_C(0x604020f0);
+    else if (   BaseAddr < UINT64_C(0xffffff7f820df000) - _4G
+             || BaseAddr > UINT64_C(0xffffff7f820df000) + _4G)
+        *pValue = UINT64_C(0xffffff7f820df000);
+    else
+        *pValue = UINT64_C(0xffffff7c820df000);
     if (g_cBits == 32)
         *pValue &= UINT32_MAX;
@@ -289,26 +292,34 @@
     RTR3InitExe(argc, &argv, 0);
 
-    int rcRet = 0;
-    if (argc <= 2)
-    {
-        RTPrintf("usage: %s <load-addr> <module> [addr1 []]\n", argv[0]);
-        return 1;
-    }
-
     /*
      * Module & code bitness (optional).
      */
     g_cBits = ARCH_BITS;
-    if (!strcmp(argv[1], "--32"))
-    {
-        g_cBits = 32;
+#if !defined(RT_OS_WINDOWS) || defined(RT_OS_DARWIN)
+    g_fNearImports = false;
+#else
+    g_fNearImports = true;
+#endif
+    while (argc > 1)
+    {
+        if (!strcmp(argv[1], "--32"))
+            g_cBits = 32;
+        else if (!strcmp(argv[1], "--64"))
+            g_cBits = 64;
+        else if (!strcmp(argv[1], "--near-imports"))
+            g_fNearImports = true;
+        else if (!strcmp(argv[1], "--wide-imports"))
+            g_fNearImports = false;
+        else
+            break;
         argc--;
         argv++;
     }
-    else if (!strcmp(argv[1], "--64"))
-    {
-        g_cBits = 64;
-        argc--;
-        argv++;
+
+    int rcRet = 0;
+    if (argc <= 2)
+    {
+        RTPrintf("usage: %s [--32|--64] [--<near|wide>-imports] <load-addr> <module> [addr1 []]\n", argv[0]);
+        return 1;
     }
 
