libsel4vmm: update to use new libelf API
diff --git a/libsel4vmm/include/vmm/platform/elf_helper.h b/libsel4vmm/include/vmm/platform/elf_helper.h
index c19b635..a70b7a7 100644
--- a/libsel4vmm/include/vmm/platform/elf_helper.h
+++ b/libsel4vmm/include/vmm/platform/elf_helper.h
@@ -14,10 +14,11 @@
 
 #include "vmm/vmm.h"
 #include <stdio.h>
+#include <elf/elf.h>
 
 /*
 	Reads the elf header and elf program headers from a file
 		when given a sufficiently large memory buffer
 */
-int vmm_read_elf_headers(void *buf, vmm_t *vmm, FILE *file, size_t buf_size);
+int vmm_read_elf_headers(void *buf, vmm_t *vmm, FILE *file, size_t buf_size, elf_t *elf);
 
diff --git a/libsel4vmm/src/platform/boot_guest.c b/libsel4vmm/src/platform/boot_guest.c
index 749be2f..7429c61 100644
--- a/libsel4vmm/src/platform/boot_guest.c
+++ b/libsel4vmm/src/platform/boot_guest.c
@@ -525,6 +525,7 @@
 int vmm_load_guest_elf(vmm_t *vmm, const char *elfname, size_t alignment) {
     int ret;
     char elf_file[256];
+    elf_t elf;
 
     DPRINTF(4, "Loading guest elf %s\n", elfname);
     FILE *file = fopen(elfname, "r");
@@ -533,13 +534,13 @@
         return -1;
     }
 
-    ret = vmm_read_elf_headers(elf_file, vmm, file, sizeof(elf_file));
+    ret = vmm_read_elf_headers(elf_file, vmm, file, sizeof(elf_file), &elf);
     if(ret < 0) {
         ZF_LOGE("Guest elf \"%s\" invalid.", elfname);
         return -1;
     }
 
-    unsigned int n_headers = elf_getNumProgramHeaders(elf_file);
+    unsigned int n_headers = elf_getNumProgramHeaders(&elf);
 
     /* Find the largest guest ram region and use that for loading */
     uintptr_t load_addr = guest_ram_largest_free_region_start(&vmm->guest_mem);
@@ -550,14 +551,14 @@
     uintptr_t guest_kernel_addr = 0xFFFFFFFF;
     uintptr_t guest_kernel_vaddr = 0xFFFFFFFF;
     for (int i = 0; i < n_headers; i++) {
-        if (elf_getProgramHeaderType(elf_file, i) != PT_LOAD) {
+        if (elf_getProgramHeaderType(&elf, i) != PT_LOAD) {
             continue;
         }
-        uint32_t addr = elf_getProgramHeaderPaddr(elf_file, i);
+        uint32_t addr = elf_getProgramHeaderPaddr(&elf, i);
         if (addr < guest_kernel_addr) {
             guest_kernel_addr = addr;
         }
-        uint32_t vaddr = elf_getProgramHeaderVaddr(elf_file, i);
+        uint32_t vaddr = elf_getProgramHeaderVaddr(&elf, i);
         if (vaddr < guest_kernel_vaddr) {
             guest_kernel_vaddr = vaddr;
         }
@@ -577,16 +578,16 @@
         unsigned int file_size, segment_size;
 
         /* Skip unloadable program headers. */
-        if (elf_getProgramHeaderType(elf_file, i) != PT_LOAD) {
+        if (elf_getProgramHeaderType(&elf, i) != PT_LOAD) {
             continue;
         }
 
         /* Fetch information about this segment. */
-        source_offset = elf_getProgramHeaderOffset(elf_file, i);
-        file_size = elf_getProgramHeaderFileSize(elf_file, i);
-        segment_size = elf_getProgramHeaderMemorySize(elf_file, i);
+        source_offset = elf_getProgramHeaderOffset(&elf, i);
+        file_size = elf_getProgramHeaderFileSize(&elf, i);
+        segment_size = elf_getProgramHeaderMemorySize(&elf, i);
 
-        dest_addr = (seL4_Word) elf_getProgramHeaderPaddr(elf_file, i);
+        dest_addr = elf_getProgramHeaderPaddr(&elf, i);
         dest_addr += guest_relocation_offset;
 
         if (!segment_size) {
@@ -605,7 +606,7 @@
     }
 
     /* Record the entry point. */
-    vmm->guest_image.entry = elf_getEntryPoint(elf_file);
+    vmm->guest_image.entry = elf_getEntryPoint(&elf);
     vmm->guest_image.entry += guest_relocation_offset;
 
     /* Remember where we started loading the kernel to fix up relocations in future */
diff --git a/libsel4vmm/src/platform/elf_helper.c b/libsel4vmm/src/platform/elf_helper.c
index 95ee6d0..7a227c3 100644
--- a/libsel4vmm/src/platform/elf_helper.c
+++ b/libsel4vmm/src/platform/elf_helper.c
@@ -11,28 +11,21 @@
  */
 
 #include <elf/elf.h>
-#include <elf/elf32.h>
 #include "vmm/platform/elf_helper.h"
 
 /*
 	Reads the elf header and elf program headers from a file
 		when given a sufficiently large memory buffer
 */
-int vmm_read_elf_headers(void *buf, vmm_t *vmm, FILE *file, size_t buf_size) {
+int vmm_read_elf_headers(void *buf, vmm_t *vmm, FILE *file, size_t buf_size, elf_t *elf) {
 	size_t result;
-	if(buf_size < sizeof(struct Elf32_Header))
+	if(buf_size < sizeof(Elf32_Ehdr))
 		return -1;
 
     fseek(file, 0, SEEK_SET);
     result = fread(buf, buf_size, 1, file);
 	if(result != 1)
 		return -1;
-	if(elf_checkFile(buf) < 0)
-		return -1;
 
-	struct Elf32_Header *chck_elf = (struct Elf32_Header *)buf;
-	if(chck_elf->e_ehsize + (chck_elf->e_phnum * chck_elf->e_phentsize) > buf_size)
-		return -1;
-
-	return 0;
+    return elf_newFile_maybe_unsafe(buf, buf_size, true, false, elf);
 }