Index: kernel/generic/src/lib/elf.c
===================================================================
--- kernel/generic/src/lib/elf.c	(revision 5d494b3f7a42392f3a69ba78ee3c67c3969e5041)
+++ kernel/generic/src/lib/elf.c	(revision 10ef329a86471ef42e84a0db45f6e6b1b10d45bd)
@@ -101,4 +101,8 @@
 		return EE_UNSUPPORTED;
 
+	/* Check if the ELF image starts on a page boundary */
+	if (ALIGN_UP((uintptr_t)header, PAGE_SIZE) != (uintptr_t)header)
+		return EE_UNSUPPORTED;
+
 	/* Walk through all segment headers and process them. */
 	for (i = 0; i < header->e_phnum; i++) {
@@ -183,4 +187,6 @@
 	int flags = 0;
 	mem_backend_data_t backend_data;
+	uintptr_t base;
+	size_t mem_sz;
 	
 	backend_data.elf = elf;
@@ -202,11 +208,12 @@
 	flags |= AS_AREA_CACHEABLE;
 
-	/*
-	 * Check if the virtual address starts on page boundary.
+	/* 
+	 * Align vaddr down, inserting a little "gap" at the beginning.
+	 * Adjust area size, so that its end remains in place.
 	 */
-	if (ALIGN_UP(entry->p_vaddr, PAGE_SIZE) != entry->p_vaddr)
-		return EE_UNSUPPORTED;
-
-	a = as_area_create(as, flags, entry->p_memsz, entry->p_vaddr,
+	base = ALIGN_DOWN(entry->p_vaddr, PAGE_SIZE);
+	mem_sz = entry->p_memsz + (entry->p_vaddr - base);
+
+	a = as_area_create(as, flags, mem_sz, base,
 	    AS_AREA_ATTR_NONE, &elf_backend, &backend_data);
 	if (!a)
