Use AoS for modules instead of SoA
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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_
|
||||
|
||||
Reference in New Issue
Block a user