Index: kernel/generic/src/lib/elf.c
===================================================================
--- kernel/generic/src/lib/elf.c	(revision e32e092d6f8bed442ecc81b18af9ef323bc4e650)
+++ kernel/generic/src/lib/elf.c	(revision 5e8ddf5690a75f99176a2b7d8083393b9361e06b)
@@ -58,5 +58,5 @@
 
 static int segment_header(elf_segment_header_t *entry, elf_header_t *elf,
-    as_t *as);
+    as_t *as, int flags);
 static int section_header(elf_section_header_t *entry, elf_header_t *elf,
     as_t *as);
@@ -68,7 +68,8 @@
  * @param header Pointer to ELF header in memory
  * @param as Created and properly mapped address space
+ * @param flags A combination of ELD_F_*
  * @return EE_OK on success
  */
-unsigned int elf_load(elf_header_t *header, as_t * as)
+unsigned int elf_load(elf_header_t *header, as_t * as, int flags)
 {
 	int i, rc;
@@ -111,5 +112,5 @@
 		seghdr = &((elf_segment_header_t *)(((uint8_t *) header) +
 		    header->e_phoff))[i];
-		rc = segment_header(seghdr, header, as);
+		rc = segment_header(seghdr, header, as, flags);
 		if (rc != EE_OK)
 			return rc;
@@ -152,6 +153,8 @@
  */
 static int segment_header(elf_segment_header_t *entry, elf_header_t *elf,
-    as_t *as)
-{
+    as_t *as, int flags)
+{
+	char *interp;
+
 	switch (entry->p_type) {
 	case PT_NULL:
@@ -163,4 +166,14 @@
 	case PT_DYNAMIC:
 	case PT_INTERP:
+		interp = (char *)elf + entry->p_offset;
+		/* FIXME */
+		/*if (memcmp((uintptr_t)interp, (uintptr_t)ELF_INTERP_ZSTR,
+		    ELF_INTERP_ZLEN) != 0) {
+			return EE_UNSUPPORTED;
+		}*/
+		if ((flags & ELD_F_LOADER) == 0) {
+			return EE_LOADER;
+		}
+		break;
 	case PT_SHLIB:
 	case PT_NOTE:
