elf_loader: add elf_loadmem() to load file from memory

rockbox-gerrit-noreply--- via rockbox-cvs <[email protected]>
Newsgroups gmane.comp.systems.archos.rockbox.cvs
Message-ID <[email protected]>
commit 7868e45edbfca111bd8f45595b2f04ba445d8199
Author: Aidan MacDonald <[email protected]>
Date:   Sat Jan 10 22:05:21 2026 +0000

    elf_loader: add elf_loadmem() to load file from memory
    
    Change-Id: Ib68b0e8b610d45713a2d5480da015cc4295f2676

diff --git a/firmware/elf_loader.c b/firmware/elf_loader.c
index d1f08f661c..637dadb886 100644
--- a/firmware/elf_loader.c
+++ b/firmware/elf_loader.c
@@ -183,3 +183,29 @@ int elf_loadpath(const char *filename,
     close(fd);
     return err;
 }
+
+int elf_loadmem(const void *elf_buffer,
+                size_t elf_size,
+                const struct elf_load_context *ctx,
+                void **entrypoint)
+{
+    struct elf_loadmem_state state = {
+        .buffer = elf_buffer,
+        .size = elf_size,
+    };
+
+    return elf_load(elf_read_mem_callback, (intptr_t)&state, ctx, entrypoint);
+}
+
+int elf_read_mem_callback(intptr_t loadmem_state, off_t pos, void *buf, size_t size)
+{
+    struct elf_loadmem_state *state = (void *)loadmem_state;
+
+    if (pos < 0 || (size_t)pos >= state->size)
+        return -1;
+    if (state->size - (size_t)pos < size)
+        return -1;
+
+    memcpy(buf, state->buffer + pos, size);
+    return 0;
+}
diff --git a/firmware/include/elf_loader.h b/firmware/include/elf_loader.h
index 344a4eb4e1..9b7550bc62 100644
--- a/firmware/include/elf_loader.h
+++ b/firmware/include/elf_loader.h
@@ -100,4 +100,16 @@ int elf_loadpath(const char *filename,
                  const struct elf_load_context *ctx,
                  void **entrypoint);
 
+struct elf_loadmem_state
+{
+    const void *buffer;
+    size_t size;
+};
+
+int elf_loadmem(const void *elf_buffer,
+                size_t elf_size,
+                const struct elf_load_context *ctx,
+                void **entrypoint);
+int elf_read_mem_callback(intptr_t loadmem_state, off_t pos, void *buf, size_t size);
+
 #endif /* __ELF_LOADER_H__ */
-- 
rockbox-cvs mailing list
[email protected]
https://lists.haxx.se/mailman/listinfo/rockbox-cvs
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.