rts: Handle zero-sized mappings in MachO linker
authorBen Gamari <ben@smart-cactus.org>
Tue, 28 May 2019 13:43:36 +0000 (09:43 -0400)
committerMarge Bot <ben+marge-bot@smart-cactus.org>
Thu, 30 May 2019 11:29:47 +0000 (07:29 -0400)
As noted in #16701, it is possible that we will find that an object has
no segments needing to be mapped. Previously this would result in mmap
being called for a zero-length mapping, which would fail. We now simply
skip the mmap call in this case; the rest of the logic just works.

rts/linker/MachO.c

index 21e46a3..9516eac 100644 (file)
@@ -1122,8 +1122,12 @@ ocBuildSegments_MachO(ObjectCode *oc)
         n_activeSegments++;
     }
 
-    mem = mmapForLinker(size_compound, MAP_ANON, -1, 0);
-    if (NULL == mem) return 0;
+    // N.B. it's possible that there is nothing mappable in an object. In this
+    // case we avoid the mmap call since it would fail. See #16701.
+    if (size_compound > 0) {
+        mem = mmapForLinker(size_compound, MAP_ANON, -1, 0);
+        if (NULL == mem) return 0;
+    }
 
     IF_DEBUG(linker, debugBelch("ocBuildSegments: allocating %d segments\n", n_activeSegments));
     segments = (Segment*)stgCallocBytes(n_activeSegments, sizeof(Segment),