diff options
author | Ben Gamari <ben@smart-cactus.org> | 2019-05-28 09:43:36 -0400 |
---|---|---|
committer | Marge Bot <ben+marge-bot@smart-cactus.org> | 2019-05-30 07:29:47 -0400 |
commit | 4ad37a323b9cdb830d718dec08c2960e34410a43 (patch) | |
tree | 669b18bb44a88f3ac412638e8fa40460cdcee436 | |
parent | ade53ce29fddc49162f409567c2e76feb5f21c66 (diff) | |
download | haskell-4ad37a323b9cdb830d718dec08c2960e34410a43.tar.gz |
rts: Handle zero-sized mappings in MachO linker
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.
-rw-r--r-- | rts/linker/MachO.c | 8 |
1 files changed, 6 insertions, 2 deletions
diff --git a/rts/linker/MachO.c b/rts/linker/MachO.c index 21e46a30d2..9516eac1f2 100644 --- a/rts/linker/MachO.c +++ b/rts/linker/MachO.c @@ -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), |