On 11/5/24 13:53, Richard Henderson wrote:
By using elf files, we make it easier to disassemble
the test file, to match comparison failures to code.
Signed-off-by: Richard Henderson <richard.hender...@linaro.org>
---
risu.c | 53 +++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 53 insertions(+)
diff --git a/risu.c b/risu.c
index c28b4a5..e3845f6 100644
--- a/risu.c
+++ b/risu.c
@@ -24,6 +24,8 @@
#include <sys/mman.h>
#include <fcntl.h>
#include <string.h>
+#include <elf.h>
+#include <endian.h>
#include "config.h"
#include "risu.h"
@@ -371,6 +373,57 @@ static void load_image(const char *imgfile)
close(fd);
Maybe move the code here, doing 'addr = e32 | e64;', ...
image_start = addr;
image_start_address = (uintptr_t) addr;
+
+ /*
+ * TODO: More complete parsing of ELF file, verify assumtion, namely:
+ * Single PT_LOAD covering the ELF header, code and data.
+ * For now, simply update image_start from the elf header.
+ */
+ if (memcmp(addr, ELFMAG, SELFMAG) == 0) {
+ const unsigned char *e_ident = addr;
+ bool swap, is_64;
+
+ switch (e_ident[EI_DATA]) {
+ case ELFDATA2LSB:
+ swap = __BYTE_ORDER != __LITTLE_ENDIAN;
+ break;
+ case ELFDATA2MSB:
+ swap = __BYTE_ORDER == __LITTLE_ENDIAN;
+ break;
+ default:
+ fprintf(stderr, "%s: Bad elf header: EI_DATA = %x\n",
+ imgfile, e_ident[EI_DATA]);
+ exit(1);
+ }
+ switch (e_ident[EI_CLASS]) {
+ case ELFCLASS32:
+ is_64 = false;
+ break;
+ case ELFCLASS64:
+ is_64 = true;
+ break;
+ default:
+ fprintf(stderr, "%s: Bad elf header: EI_CLASS = %x\n",
+ imgfile, e_ident[EI_CLASS]);
+ exit(1);
+ }
+
+ if (is_64) {
+ const Elf64_Ehdr *h64 = addr;
+ Elf64_Addr e64 = h64->e_entry;
+ if (swap) {
+ e64 = __builtin_bswap64(e64);
+ }
+ image_start = addr + e64;
+ } else {
+ const Elf32_Ehdr *h32 = addr;
+ Elf32_Addr e32 = h32->e_entry;
+ if (swap) {
+ e32 = __builtin_bswap32(e32);
+ }
+ image_start = addr + e32;
+ }
+ }
... otherwise image_start_address == &e_ident.
}
static int master(void)