From 658b7fc9bf450b531655745f582ff0d0e369fe33 Mon Sep 17 00:00:00 2001
From: Ben Gamari <ben@smart-cactus.org>
Date: Wed, 18 Nov 2020 11:40:29 -0500
Subject: [PATCH] rts/linker: Align bssSize to page size when mapping symbol
 extras

We place symbol_extras right after bss. We also need
to ensure that symbol_extras can be mprotect'd independently from the
rest of the image. To ensure this we round up the size of bss to a page
boundary, thus ensuring that symbol_extras is also page-aligned.

(cherry picked from commit 9f40cf6ca9fb24dbc55f7eae43e2b89aa12bf251)
(cherry picked from commit 4b83b6a8f8ac08e81b6e75c47f133e3ed6bdea95)
---
 rts/linker/SymbolExtras.c | 4 +++-
 1 file changed, 3 insertions(+), 1 deletion(-)

diff --git a/rts/linker/SymbolExtras.c b/rts/linker/SymbolExtras.c
index b5a06c662c52..7f77d5120ac4 100644
--- a/rts/linker/SymbolExtras.c
+++ b/rts/linker/SymbolExtras.c
@@ -77,7 +77,9 @@ int ocAllocateExtras(ObjectCode* oc, int count, int first, int bssSize)
       /* N.B. We currently can't mark symbol extras as non-executable in this
        * case. */
       size_t n = roundUpToPage(oc->fileSize);
-      bssSize = roundUpToAlign(bssSize, 8);
+      // round bssSize up to the nearest page size since we need to ensure that
+      // symbol_extras is aligned to a page boundary so it can be mprotect'd.
+      bssSize = roundUpToPage(bssSize);
       size_t allocated_size = n + bssSize + extras_size;
       void *new = mmapForLinker(allocated_size, PROT_READ | PROT_WRITE, MAP_ANONYMOUS, -1, 0);
       if (new) {
-- 
GitLab