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);
}