diff --git a/src/moduler/elf.c b/src/moduler/elf.c index edc3a4e..82a9156 100644 --- a/src/moduler/elf.c +++ b/src/moduler/elf.c @@ -1,3 +1,112 @@ #include "elf.h" -#include + +const char *dyn_type_to_str(unsigned type) { + // clang-format off + switch (type) { + case DT_NULL: return "NULL"; + case DT_NEEDED: return "NEEDED"; + case DT_PLTRELSZ: return "PLTRELSZ"; + case DT_PLTGOT: return "PLTGOT"; + case DT_HASH: return "HASH"; + case DT_STRTAB: return "STRTAB"; + case DT_SYMTAB: return "SYMTAB"; + case DT_RELA: return "RELA"; + case DT_RELASZ: return "RELASZ"; + case DT_RELAENT: return "RELAENT"; + case DT_STRSZ: return "STRSZ"; + case DT_SYMENT: return "SYMENT"; + case DT_INIT: return "INIT"; + case DT_FINI: return "FINI"; + case DT_SONAME: return "SONAME"; + case DT_RPATH: return "RPATH"; + case DT_SYMBOLIC: return "SYMBOLIC"; + case DT_REL: return "REL"; + case DT_RELSZ: return "RELSZ"; + case DT_RELENT: return "RELENT"; + case DT_PLTREL: return "PLTREL"; + case DT_DEBUG: return "DEBUG"; + case DT_TEXTREL: return "TEXTREL"; + case DT_JMPREL: return "JMPREL"; + case DT_BIND_NOW: return "BIND_NOW"; + case DT_INIT_ARRAY: return "INIT_ARRAY"; + case DT_FINI_ARRAY: return "FINI_ARRAY"; + case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ"; + case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ"; + case DT_RUNPATH: return "RUNPATH"; + case DT_FLAGS: return "FLAGS"; + case DT_PREINIT_ARRAY: return "ENCODING/PREINIT_ARRAY"; + case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ"; + case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX"; + case DT_RELRSZ: return "RELRSZ"; + case DT_RELR: return "RELR"; + case DT_RELRENT: return "RELRENT"; + case DT_NUM: return "NUM"; + case DT_LOOS: return "LOOS"; + case DT_HIOS: return "HIOS"; + case DT_LOPROC: return "LOPROC"; + case DT_HIPROC: return "HIPROC"; + case DT_PROCNUM: return "PROCNUM"; + case DT_VALRNGLO: return "VALRNGLO"; + case DT_GNU_PRELINKED: return "GNU_PRELINKED"; + case DT_GNU_CONFLICTSZ: return "GNU_CONFLICTSZ"; + case DT_GNU_LIBLISTSZ: return "GNU_LIBLISTSZ"; + case DT_CHECKSUM: return "CHECKSUM"; + case DT_PLTPADSZ: return "PLTPADSZ"; + case DT_MOVEENT: return "MOVEENT"; + case DT_MOVESZ: return "MOVESZ"; + case DT_FEATURE_1: return "FEATURE_1"; + case DT_POSFLAG_1: return "POSFLAG_1"; + case DT_SYMINSZ: return "SYMINSZ"; + case DT_SYMINENT: return "SYMINENT/VALRNGHI"; + case DT_ADDRRNGLO: return "ADDRRNGLO"; + case DT_GNU_HASH: return "GNU_HASH"; + case DT_TLSDESC_PLT: return "TLSDESC_PLT"; + case DT_TLSDESC_GOT: return "TLSDESC_GOT"; + case DT_GNU_CONFLICT: return "GNU_CONFLICT"; + case DT_GNU_LIBLIST: return "GNU_LIBLIST"; + case DT_CONFIG: return "CONFIG"; + case DT_DEPAUDIT: return "DEPAUDIT"; + case DT_AUDIT: return "AUDIT"; + case DT_PLTPAD: return "PLTPAD"; + case DT_MOVETAB: return "MOVETAB"; + case DT_SYMINFO: return "SYMINFO/ADDRRNGHI"; + case DT_VERSYM: return "VERSYM"; + case DT_RELACOUNT: return "RELACOUNT"; + case DT_RELCOUNT: return "RELCOUNT"; + case DT_FLAGS_1: return "FLAGS_1"; + case DT_VERDEF: return "VERDEF"; + case DT_VERDEFNUM: return "VERDEFNUM"; + case DT_VERNEED: return "VERNEED"; + case DT_VERNEEDNUM: return "VERNEEDNUM"; + default: return "UNKNOWN"; + } + // clang-format on +} + +const char *segment_type_to_str(unsigned type) { + // clang-format off + switch (type) { + case PT_NULL: return "NULL"; + case PT_LOAD: return "LOAD"; + case PT_DYNAMIC: return "DYNAMIC"; + case PT_INTERP: return "INTERP"; + case PT_NOTE: return "NOTE"; + case PT_SHLIB: return "SHLIB"; + case PT_PHDR: return "PHDR"; + case PT_TLS: return "TLS"; + case PT_NUM: return "NUM"; + case PT_LOOS: return "LOOS"; + case PT_GNU_EH_FRAME: return "GNU_EH_FRAME"; + case PT_GNU_STACK: return "GNU_STACK"; + case PT_GNU_RELRO: return "GNU_RELRO"; + case PT_GNU_PROPERTY: return "GNU_PROPERTY"; + case PT_LOSUNW: return "LOSUNW/SUNWBSS"; + case PT_SUNWSTACK: return "SUNWSTACK"; + case PT_HIOS: return "HIOS"; + case PT_LOPROC: return "LOPROC"; + case PT_HIPROC: return "HIPROC"; + default: return "UNKNOWN"; + } + // clang-format on +} diff --git a/src/moduler/elf.h b/src/moduler/elf.h index 63b83eb..679bb5d 100644 --- a/src/moduler/elf.h +++ b/src/moduler/elf.h @@ -3,82 +3,7 @@ #include -static inline const char *dyn_type_to_str(unsigned type) { - // clang-format off - switch (type) { - case DT_NULL: return "NULL"; - case DT_NEEDED: return "NEEDED"; - case DT_PLTRELSZ: return "PLTRELSZ"; - case DT_PLTGOT: return "PLTGOT"; - case DT_HASH: return "HASH"; - case DT_STRTAB: return "STRTAB"; - case DT_SYMTAB: return "SYMTAB"; - case DT_RELA: return "RELA"; - case DT_RELASZ: return "RELASZ"; - case DT_RELAENT: return "RELAENT"; - case DT_STRSZ: return "STRSZ"; - case DT_SYMENT: return "SYMENT"; - case DT_INIT: return "INIT"; - case DT_FINI: return "FINI"; - case DT_SONAME: return "SONAME"; - case DT_RPATH: return "RPATH"; - case DT_SYMBOLIC: return "SYMBOLIC"; - case DT_REL: return "REL"; - case DT_RELSZ: return "RELSZ"; - case DT_RELENT: return "RELENT"; - case DT_PLTREL: return "PLTREL"; - case DT_DEBUG: return "DEBUG"; - case DT_TEXTREL: return "TEXTREL"; - case DT_JMPREL: return "JMPREL"; - case DT_BIND_NOW: return "BIND_NOW"; - case DT_INIT_ARRAY: return "INIT_ARRAY"; - case DT_FINI_ARRAY: return "FINI_ARRAY"; - case DT_INIT_ARRAYSZ: return "INIT_ARRAYSZ"; - case DT_FINI_ARRAYSZ: return "FINI_ARRAYSZ"; - case DT_RUNPATH: return "RUNPATH"; - case DT_FLAGS: return "FLAGS"; - case DT_PREINIT_ARRAY: return "ENCODING/PREINIT_ARRAY"; - case DT_PREINIT_ARRAYSZ: return "PREINIT_ARRAYSZ"; - case DT_SYMTAB_SHNDX: return "SYMTAB_SHNDX"; - case DT_RELRSZ: return "RELRSZ"; - case DT_RELR: return "RELR"; - case DT_RELRENT: return "RELRENT"; - case DT_NUM: return "NUM"; - case DT_LOOS: return "LOOS"; - case DT_HIOS: return "HIOS"; - case DT_LOPROC: return "LOPROC"; - case DT_HIPROC: return "HIPROC"; - case DT_PROCNUM: return "PROCNUM"; - default: return "UNKNOWN"; - } - // clang-format on -} - -static inline const char *segment_type_to_str(unsigned type) { - // clang-format off - switch (type) { - case PT_NULL: return "NULL"; - case PT_LOAD: return "LOAD"; - case PT_DYNAMIC: return "DYNAMIC"; - case PT_INTERP: return "INTERP"; - case PT_NOTE: return "NOTE"; - case PT_SHLIB: return "SHLIB"; - case PT_PHDR: return "PHDR"; - case PT_TLS: return "TLS"; - case PT_NUM: return "NUM"; - case PT_LOOS: return "LOOS"; - case PT_GNU_EH_FRAME: return "GNU_EH_FRAME"; - case PT_GNU_STACK: return "GNU_STACK"; - case PT_GNU_RELRO: return "GNU_RELRO"; - case PT_GNU_PROPERTY: return "GNU_PROPERTY"; - case PT_LOSUNW: return "LOSUNW/SUNWBSS"; - case PT_SUNWSTACK: return "SUNWSTACK"; - case PT_HIOS: return "HIOS"; - case PT_LOPROC: return "LOPROC"; - case PT_HIPROC: return "HIPROC"; - default: return "UNKNOWN"; - } - // clang-format on -} +const char *dyn_type_to_str(unsigned type); +const char *segment_type_to_str(unsigned type); #endif diff --git a/src/moduler/moduler.c b/src/moduler/moduler.c index a2332c2..1db5556 100644 --- a/src/moduler/moduler.c +++ b/src/moduler/moduler.c @@ -1,8 +1,8 @@ #include "moduler.h" #include "logger/logger.h" -#include "moduler/elf.h" #include "memory.h" +#include "moduler/elf.h" #include "types.h" HiloadResult moduler_reload(ModuleInfos *modinfos, @@ -11,36 +11,87 @@ HiloadResult moduler_reload(ModuleInfos *modinfos, 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); + memspan.region_end); - - Elf *elf = elf_memory((void*)memspan.region_start, memspan.region_end - memspan.region_start); + 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)); + log_error("%s\n", elf_errmsg(err)); } - void *module_address = (void*)sc_array_at(&modinfos->addresses, modindex); + 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)); + 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; + 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; - } + void *strtab = 0; + void *symtab = 0; + size_t strsz = 0; + size_t syment = 0; + void *rela = 0; + size_t relasz = 0; + size_t relaent = 0; + size_t relacount = 0; + void *pltgot = 0; + size_t pltrelsz = 0; + void *pltrel = 0; + + 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)); + + if (dyn->d_tag == DT_STRTAB) { + strtab = (void *)dyn->d_un.d_ptr; + } else if (dyn->d_tag == DT_SYMTAB) { + symtab = (void *)dyn->d_un.d_ptr; + } else if (dyn->d_tag == DT_STRSZ) { + strsz = dyn->d_un.d_val; + } else if (dyn->d_tag == DT_SYMENT) { + syment = dyn->d_un.d_val; + } else if (dyn->d_tag == DT_RELA) { + rela = (void *)dyn->d_un.d_ptr; + } else if (dyn->d_tag == DT_RELASZ) { + relasz = dyn->d_un.d_val; + } else if (dyn->d_tag == DT_RELAENT) { + relaent = dyn->d_un.d_val; + } else if (dyn->d_tag == DT_RELACOUNT) { + relacount = dyn->d_un.d_val; + } else if (dyn->d_tag == DT_PLTGOT) { + pltgot = (void *)dyn->d_un.d_ptr; + } else if (dyn->d_tag == DT_PLTRELSZ) { + pltrelsz = dyn->d_un.d_val; + } else if (dyn->d_tag == DT_PLTREL) { + pltrel = (void *)dyn->d_un.d_val; + } + ++dyn; } + printf("strtab: %p\n" + "symtab: %p\n" + "strsz: %zu\n" + "syment: %zu\n" + "rela: %p\n" + "relasz: %zu\n" + "relaent: %zu\n" + "relacount: %zu\n" + "pltgot: %p\n" + "pltrelsz: %zu\n" + "pltrel: %p\n", + strtab, symtab, strsz, syment, rela, relasz, relaent, relacount, + pltgot, pltrelsz, pltrel); + } + + } modinfos->state[modindex] = HI_MODULE_STATE_CLEAN;