diff --git a/rts/Linker.c b/rts/Linker.c
index 9c1852d91c1d6b81a87fbb91b644594d22232cad..1b3caa0a47b61bfd561bb210c3656da6757c48e3 100644
--- a/rts/Linker.c
+++ b/rts/Linker.c
@@ -1086,6 +1086,9 @@ void
 mmapForLinkerMarkExecutable(void *start, size_t len)
 {
   DWORD old;
+  if (len == 0) {
+    return;
+  }
   if (VirtualProtect(start, len, PAGE_EXECUTE_READ, &old) == 0) {
     sysErrorBelch("mmapForLinkerMarkExecutable: failed to protect %zd bytes at %p",
                   len, start);
@@ -1257,6 +1260,9 @@ void munmapForLinker (void *addr, size_t bytes, const char *caller)
  */
 void mmapForLinkerMarkExecutable(void *start, size_t len)
 {
+    if (len == 0) {
+      return;
+    }
     IF_DEBUG(linker,
              debugBelch("mmapForLinkerMarkExecutable: protecting %" FMT_Word
                         " bytes starting at %p\n", (W_)len, start));