gather information about module.. again
This commit is contained in:
48
src/moduler/moduler.c
Normal file
48
src/moduler/moduler.c
Normal file
@@ -0,0 +1,48 @@
|
||||
#include "moduler.h"
|
||||
|
||||
#include "logger/logger.h"
|
||||
#include "moduler/elf.h"
|
||||
#include "memory.h"
|
||||
#include "types.h"
|
||||
|
||||
HiloadResult moduler_reload(ModuleInfos *modinfos,
|
||||
const struct sc_array_memreg *const memregs,
|
||||
int modindex) {
|
||||
const char *modname = sc_array_at(&modinfos->names, modindex);
|
||||
MemoryRegionSpan memspan = memory_get_module_span(memregs, modname);
|
||||
log_debugv("Module: %s - [%p, %p]\n", modname, memspan.region_start,
|
||||
memspan.region_end);
|
||||
|
||||
|
||||
Elf *elf = elf_memory((void*)memspan.region_start, memspan.region_end - memspan.region_start);
|
||||
int err = elf_errno();
|
||||
if (err) {
|
||||
log_error("%s\n", elf_errmsg(err));
|
||||
}
|
||||
|
||||
void *module_address = (void*)sc_array_at(&modinfos->addresses, modindex);
|
||||
|
||||
size_t phdrnum = 0;
|
||||
err = elf_getphdrnum(elf, &phdrnum);
|
||||
Elf64_Phdr *phdr = elf64_getphdr(elf);
|
||||
|
||||
for (size_t i = 0; i < phdrnum; ++i) {
|
||||
Elf64_Phdr *p = phdr + i;
|
||||
log_debugv("segment type: %s\n", segment_type_to_str(p->p_type));
|
||||
|
||||
size_t segment_size = p->p_memsz;
|
||||
void *segment_start = module_address + p->p_vaddr;
|
||||
void *segment_end = module_address + p->p_vaddr + segment_size;
|
||||
|
||||
if (p->p_type == PT_DYNAMIC) {
|
||||
Elf64_Dyn *dyn = (Elf64_Dyn*)segment_start;
|
||||
while ((void*)dyn < segment_end) {
|
||||
log_debugv(" dyn type: %s\n", dyn_type_to_str(dyn->d_tag));
|
||||
++dyn;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
modinfos->state[modindex] = HI_MODULE_STATE_CLEAN;
|
||||
return HILOAD_OK;
|
||||
}
|
||||
Reference in New Issue
Block a user