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.henderson@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)