From 0ab1a308139e73070b23b156a83eb094a97ba0ec Mon Sep 17 00:00:00 2001 From: Ben Gamari Date: Wed, 18 Nov 2020 11:40:29 -0500 Subject: 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. --- 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 b5a06c662c..7f77d5120a 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) { -- cgit v1.2.1