Index: generic/src/lib/elf.c
===================================================================
--- generic/src/lib/elf.c	(revision 27810c58807c31c5a0bd750c37faf88d2199cd23)
+++ generic/src/lib/elf.c	(revision 51cc6bf60f243d22f24cb12000f1c11e6b5fee13)
@@ -186,14 +186,12 @@
 		return EE_UNSUPPORTED;
 
-	/*
-	 * Copying the segment out is certainly necessary for segments with p_filesz < p_memsz
-	 * because of the effect of .bss-like sections. For security reasons, it looks like a
-	 * good idea to copy the segment anyway.
-	 */
 	segment_size = ALIGN_UP(max(entry->p_filesz, entry->p_memsz), PAGE_SIZE);
-	segment = malloc(segment_size, 0);
-	if (entry->p_filesz < entry->p_memsz)
+	if ((entry->p_flags & PF_W)) {
+		/* If writable, copy data (should be COW in the future) */
+		segment = malloc(segment_size, 0);
 		memsetb((__address) (segment + entry->p_filesz), segment_size - entry->p_filesz, 0);
-	memcpy(segment, (void *) (((__address) elf) + entry->p_offset), entry->p_filesz);
+		memcpy(segment, (void *) (((__address) elf) + entry->p_offset), entry->p_filesz);
+	} else /* Map identically original data */
+		segment = ((void *) elf) + entry->p_offset;
 
 	a = as_area_create(as, type, SIZE2FRAMES(entry->p_memsz), entry->p_vaddr);
