Index: uspace/srv/loader/arch/ia32/ia32.s
===================================================================
--- uspace/srv/loader/arch/ia32/ia32.s	(revision a624cbfd618eb08343016b682ae85fb46ada815b)
+++ uspace/srv/loader/arch/ia32/ia32.s	(revision 08c9f7d5cc380c8c348f1125ecf5135ef7e5fb1a)
@@ -47,3 +47,3 @@
 	pop %ebp
 
-	jmp %eax
+	jmp *%eax
Index: uspace/srv/loader/elf_load.c
===================================================================
--- uspace/srv/loader/elf_load.c	(revision a624cbfd618eb08343016b682ae85fb46ada815b)
+++ uspace/srv/loader/elf_load.c	(revision 08c9f7d5cc380c8c348f1125ecf5135ef7e5fb1a)
@@ -75,5 +75,5 @@
 
 /** Read until the buffer is read in its entirety. */
-static int my_read(int fd, char *buf, size_t len)
+static int my_read(int fd, void *buf, size_t len)
 {
 	int cnt = 0;
@@ -332,19 +332,24 @@
 	uintptr_t bias;
 	uintptr_t base;
+	void *seg_ptr;
+	uintptr_t seg_addr;
 	size_t mem_sz;
 	int rc;
 
-	DPRINTF("Load segment at addr 0x%x, size 0x%x\n", entry->p_vaddr,
-		entry->p_memsz);
-	
 	bias = elf->bias;
+
+	seg_addr = entry->p_vaddr + bias;
+	seg_ptr = (void *) seg_addr;
+
+	DPRINTF("Load segment at addr 0x%x, size 0x%x\n", seg_addr,
+		entry->p_memsz);	
 
 	if (entry->p_align > 1) {
 		if ((entry->p_offset % entry->p_align) !=
-		    (entry->p_vaddr % entry->p_align)) {
+		    (seg_addr % entry->p_align)) {
 			DPRINTF("Align check 1 failed offset%%align=%d, "
 			    "vaddr%%align=%d\n",
 			    entry->p_offset % entry->p_align,
-			    entry->p_vaddr % entry->p_align
+			    seg_addr % entry->p_align
 			);
 			return EE_INVALID;
@@ -365,5 +370,5 @@
 	mem_sz = entry->p_memsz + (entry->p_vaddr - base);
 
-	DPRINTF("Map to p_vaddr=0x%x-0x%x.\n", entry->p_vaddr + bias,
+	DPRINTF("Map to seg_addr=0x%x-0x%x.\n", seg_addr,
 	entry->p_vaddr + bias + ALIGN_UP(entry->p_memsz, PAGE_SIZE));
 
@@ -380,5 +385,5 @@
 
 	DPRINTF("as_area_create(0x%lx, 0x%x, %d) -> 0x%lx\n",
-		entry->p_vaddr+bias, entry->p_memsz, flags, (uintptr_t)a);
+		base + bias, mem_sz, flags, (uintptr_t)a);
 
 	/*
@@ -400,5 +405,5 @@
 
 	left = entry->p_filesz;
-	dp = (uint8_t *)(entry->p_vaddr + bias);
+	dp = seg_ptr;
 
 	while (left > 0) {
@@ -417,5 +422,5 @@
 	}
 
-	rc = as_area_change_flags((uint8_t *)entry->p_vaddr + bias, flags);
+	rc = as_area_change_flags(seg_ptr, flags);
 	if (rc != 0) {
 		DPRINTF("Failed to set memory area flags.\n");
@@ -425,5 +430,5 @@
 	if (flags & AS_AREA_EXEC) {
 		/* Enforce SMC coherence for the segment */
-		if (smc_coherence(entry->p_vaddr + bias, entry->p_filesz))
+		if (smc_coherence(seg_ptr, entry->p_filesz))
 			return EE_MEMORY;
 	}
Index: uspace/srv/loader/main.c
===================================================================
--- uspace/srv/loader/main.c	(revision a624cbfd618eb08343016b682ae85fb46ada815b)
+++ uspace/srv/loader/main.c	(revision 08c9f7d5cc380c8c348f1125ecf5135ef7e5fb1a)
@@ -80,5 +80,5 @@
 static int filc = 0;
 /** Preset files vector */
-static char **filv = NULL;
+static fdi_node_t **filv = NULL;
 /** Buffer holding all preset files */
 static fdi_node_t *fil_buf = NULL;
