store original name for modules
This commit is contained in:
@@ -33,9 +33,9 @@ static void *adjust_if_relative(void *ptr, void *module_base) {
|
||||
return (void *)p;
|
||||
}
|
||||
|
||||
static HiResult gather_patchable_symbols(VectorSymbol *symbols,
|
||||
const char *module_name,
|
||||
void *module_base) {
|
||||
static HiResult moduler_collect_symbols(VectorSymbol *symbols,
|
||||
const char *module_name,
|
||||
void *module_base) {
|
||||
symbol_clear(symbols);
|
||||
|
||||
HiResult ret = HI_FAIL;
|
||||
@@ -167,8 +167,8 @@ cleanup:
|
||||
return ret;
|
||||
}
|
||||
|
||||
static HiResult moduler_apply_module_patch(VectorSymbol *psymbols,
|
||||
MemorySpan module_memory) {
|
||||
static HiResult moduler_patch_functions(VectorSymbol *psymbols,
|
||||
MemorySpan module_memory) {
|
||||
|
||||
void *module_base = (void *)module_memory.start;
|
||||
size_t module_size = module_memory.end - module_memory.start;
|
||||
@@ -273,8 +273,8 @@ static PatchData moduler_create_patch(ModuleData *module) {
|
||||
}
|
||||
|
||||
char file_append[32];
|
||||
if (strftime(file_append, sizeof(file_append), ".%Y%m%d%H%M%S.patch", t) ==
|
||||
0) {
|
||||
const char *patch_format = ".%Y%m%d%H%M%S.patch";
|
||||
if (strftime(file_append, sizeof(file_append), patch_format, t) == 0) {
|
||||
log_error("Failed to create patch filename.\n");
|
||||
return (PatchData){0};
|
||||
}
|
||||
@@ -294,8 +294,9 @@ static PatchData moduler_create_patch(ModuleData *module) {
|
||||
return data;
|
||||
}
|
||||
|
||||
HiResult moduler_reload(VectorModuleData *modules, ModuleData *module) {
|
||||
HiResult moduler_reload(VectorModuleData *modules, size_t modindx) {
|
||||
|
||||
ModuleData *module = &vector_at(modules, modindx);
|
||||
// Return OK because this isn't an error case. We just don't do it yet
|
||||
// because we only handle reloading a complete solib. Can't do that with
|
||||
// executables.
|
||||
@@ -335,7 +336,7 @@ HiResult moduler_reload(VectorModuleData *modules, ModuleData *module) {
|
||||
symbol_init(&patch_symbols);
|
||||
|
||||
HiResult ret =
|
||||
gather_patchable_symbols(&patch_symbols, patch.filename, patch_base);
|
||||
moduler_collect_symbols(&patch_symbols, patch.filename, patch_base);
|
||||
if (!HIOK(ret)) {
|
||||
log_error("Failed to gather symbols for %s\n", patch.filename);
|
||||
return HI_FAIL;
|
||||
@@ -349,33 +350,32 @@ HiResult moduler_reload(VectorModuleData *modules, ModuleData *module) {
|
||||
|
||||
log_debug("Patching: %s\n", mod.name);
|
||||
MemorySpan module_memory = memmaps_find_by_name(mod.name, &memmaps);
|
||||
moduler_apply_module_patch(&patch_symbols, module_memory);
|
||||
moduler_patch_functions(&patch_symbols, module_memory);
|
||||
|
||||
// This relies on the patch filename being different only by the append
|
||||
if (strncmp(mod.name, patch.filename, strlen(mod.name)) == 0) {
|
||||
// If patch is for the same module, also collect local object symbols for
|
||||
// coping those over.
|
||||
|
||||
VectorSymbol module_symbols;
|
||||
symbol_init(&module_symbols);
|
||||
ret = gather_patchable_symbols(&module_symbols, mod.name,
|
||||
(void *)mod.address);
|
||||
ret = moduler_collect_symbols(&module_symbols, mod.name,
|
||||
(void *)mod.address);
|
||||
if (!HIOK(ret)) {
|
||||
log_error("Failed to gather symbols for %s\n", mod.name);
|
||||
symbol_term(&module_symbols);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Copy old data to new data. Breaks with layout changes.
|
||||
for (size_t i = 0; i < vector_size(&module_symbols); ++i) {
|
||||
Symbol *sym = &vector_at(&module_symbols, i);
|
||||
// Copy old data to new data location. Breaks if layout changes,
|
||||
// e.g. struct fields are moved around
|
||||
for (size_t j = 0; j < vector_size(&module_symbols); ++j) {
|
||||
Symbol *sym = &vector_at(&module_symbols, j);
|
||||
if (sym->type == HI_SYMBOL_TYPE_OBJECT) {
|
||||
Symbol *ps = symbol_find(&patch_symbols, sym);
|
||||
if (ps) {
|
||||
if (ps->size >= sym->size) {
|
||||
memcpy(ps->address, sym->address, sym->size);
|
||||
} else {
|
||||
memcpy(ps->address, sym->address, ps->size);
|
||||
}
|
||||
size_t copy_size = MIN(sym->size, ps->size);
|
||||
memcpy(ps->address, sym->address, copy_size);
|
||||
log_debug("Copied data for symbol: %s\n", sym->name);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user