Use AoS for modules instead of SoA

This commit is contained in:
2025-04-18 14:39:09 +03:00
parent dcf863bf26
commit 09d5020494
5 changed files with 70 additions and 91 deletions

View File

@@ -2,6 +2,7 @@
#define ELF_H_
#include <libelf.h>
#include <gelf.h>
const char *dyn_type_to_str(unsigned type);
const char *segment_type_to_str(unsigned type);

View File

@@ -4,11 +4,12 @@
#include "memory.h"
#include "moduler/elf.h"
#include "types.h"
#include <libelf.h>
HiloadResult moduler_reload(ModuleInfos *modinfos,
const struct sc_array_memreg *const memregs,
int modindex) {
const char *modname = sc_array_at(&modinfos->names, modindex);
HiloadResult moduler_reload(HiModuleData *module,
const struct sc_array_memreg *const memregs) {
const char *modname = module->name;
MemoryRegionSpan memspan = memory_get_module_span(memregs, modname);
log_debugv("Module: %s - [%p, %p]\n", modname, memspan.region_start,
memspan.region_end);
@@ -18,9 +19,10 @@ HiloadResult moduler_reload(ModuleInfos *modinfos,
int err = elf_errno();
if (err) {
log_error("%s\n", elf_errmsg(err));
return HILOAD_FAIL;
}
void *module_address = (void *)sc_array_at(&modinfos->addresses, modindex);
void *module_address = (void *)module->address;
size_t phdrnum = 0;
err = elf_getphdrnum(elf, &phdrnum);
@@ -76,7 +78,7 @@ HiloadResult moduler_reload(ModuleInfos *modinfos,
}
++dyn;
}
printf("strtab: %p\n"
log_debugv("\nstrtab: %p\n"
"symtab: %p\n"
"strsz: %zu\n"
"syment: %zu\n"
@@ -94,6 +96,6 @@ HiloadResult moduler_reload(ModuleInfos *modinfos,
}
modinfos->state[modindex] = HI_MODULE_STATE_CLEAN;
module->state = HI_MODULE_STATE_CLEAN;
return HILOAD_OK;
}

View File

@@ -8,24 +8,22 @@
struct HiloadContext;
sc_array_def(uptr, uptr);
enum HiModuleState {
HI_MODULE_STATE_CLEAN = 0,
HI_MODULE_STATE_DIRTY,
};
typedef struct {
struct sc_array_str names; // Array of library names
struct sc_array_ptr handles; // Array of library handles
struct sc_array_uptr addresses; // Array of library base addresses
struct sc_array_syms symbols; // Symbol info for modules
u8 state[256]; // Flag for when module needs to be changed
size_t count; // Number of modules
} ModuleInfos;
const char *name; // Filename if found
uptr address;
u8 state;
} HiModuleData;
sc_array_def(HiModuleData, module);
typedef struct sc_array_module HiModuleArray;
HiloadResult moduler_reload(HiModuleData *module,
const struct sc_array_memreg *const memregs);
HiloadResult moduler_reload(ModuleInfos *modinfos,
const struct sc_array_memreg *const memregs,
int modindex);
#endif // MODULER_H_