[PATCH 1/5] [DbgHelp]: factorize a bit the ELF enumeration callbacks
Eric Pouech
eric.pouech at orange.fr
Mon Dec 27 08:03:12 CST 2010
A+
---
dlls/dbghelp/elf_module.c | 128 +++++++++++++++++++++------------------------
1 files changed, 61 insertions(+), 67 deletions(-)
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index b3502ca..b8ddfcb 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -1279,65 +1279,6 @@ static BOOL elf_enum_modules_internal(const struct process* pcs,
return TRUE;
}
-struct elf_sync
-{
- struct process* pcs;
- struct elf_info elf_info;
-};
-
-static BOOL elf_enum_sync_cb(const WCHAR* name, unsigned long load_addr,
- unsigned long dyn_addr, void* user)
-{
- struct elf_sync* es = user;
-
- elf_search_and_load_file(es->pcs, name, load_addr, dyn_addr, &es->elf_info);
- return TRUE;
-}
-
-/******************************************************************
- * elf_synchronize_module_list
- *
- * this functions rescans the debuggee module's list and synchronizes it with
- * the one from 'pcs', ie:
- * - if a module is in debuggee and not in pcs, it's loaded into pcs
- * - if a module is in pcs and not in debuggee, it's unloaded from pcs
- */
-BOOL elf_synchronize_module_list(struct process* pcs)
-{
- struct module* module;
- struct elf_sync es;
-
- for (module = pcs->lmodules; module; module = module->next)
- {
- if (module->type == DMT_ELF && !module->is_virtual)
- module->format_info[DFI_ELF]->u.elf_info->elf_mark = 0;
- }
-
- es.pcs = pcs;
- es.elf_info.flags = ELF_INFO_MODULE;
- if (!elf_enum_modules_internal(pcs, NULL, elf_enum_sync_cb, &es))
- return FALSE;
-
- module = pcs->lmodules;
- while (module)
- {
- if (module->type == DMT_ELF && !module->is_virtual)
- {
- struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info;
-
- if (!elf_info->elf_mark && !elf_info->elf_loader)
- {
- module_remove(pcs, module);
- /* restart all over */
- module = pcs->lmodules;
- continue;
- }
- }
- module = module->next;
- }
- return TRUE;
-}
-
/******************************************************************
* elf_search_loader
*
@@ -1440,19 +1381,25 @@ static BOOL elf_load_cb(const WCHAR* name, unsigned long load_addr,
unsigned long dyn_addr, void* user)
{
struct elf_load* el = user;
+ BOOL ret = TRUE;
const WCHAR* p;
- /* memcmp is needed for matches when bufstr contains also version information
- * el->name: libc.so, name: libc.so.6.0
- */
- p = strrchrW(name, '/');
- if (!p++) p = name;
- if (!memcmp(p, el->name, lstrlenW(el->name) * sizeof(WCHAR)))
+ if (el->name)
+ {
+ /* memcmp is needed for matches when bufstr contains also version information
+ * el->name: libc.so, name: libc.so.6.0
+ */
+ p = strrchrW(name, '/');
+ if (!p++) p = name;
+ }
+
+ if (!el->name || !memcmp(p, el->name, lstrlenW(el->name) * sizeof(WCHAR)))
{
el->ret = elf_search_and_load_file(el->pcs, name, load_addr, dyn_addr, &el->elf_info);
- return FALSE;
+ if (el->name) ret = FALSE;
}
- return TRUE;
+
+ return ret;
}
/******************************************************************
@@ -1494,6 +1441,53 @@ struct module* elf_load_module(struct process* pcs, const WCHAR* name, unsigned
return el.elf_info.module;
}
+/******************************************************************
+ * elf_synchronize_module_list
+ *
+ * this functions rescans the debuggee module's list and synchronizes it with
+ * the one from 'pcs', ie:
+ * - if a module is in debuggee and not in pcs, it's loaded into pcs
+ * - if a module is in pcs and not in debuggee, it's unloaded from pcs
+ */
+BOOL elf_synchronize_module_list(struct process* pcs)
+{
+ struct module* module;
+ struct elf_load el;
+
+ for (module = pcs->lmodules; module; module = module->next)
+ {
+ if (module->type == DMT_ELF && !module->is_virtual)
+ module->format_info[DFI_ELF]->u.elf_info->elf_mark = 0;
+ }
+
+ el.pcs = pcs;
+ el.elf_info.flags = ELF_INFO_MODULE;
+ el.ret = FALSE;
+ el.name = NULL; /* fetch all modules */
+
+ if (!elf_enum_modules_internal(pcs, NULL, elf_load_cb, &el))
+ return FALSE;
+
+ module = pcs->lmodules;
+ while (module)
+ {
+ if (module->type == DMT_ELF && !module->is_virtual)
+ {
+ struct elf_module_info* elf_info = module->format_info[DFI_ELF]->u.elf_info;
+
+ if (!elf_info->elf_mark && !elf_info->elf_loader)
+ {
+ module_remove(pcs, module);
+ /* restart all over */
+ module = pcs->lmodules;
+ continue;
+ }
+ }
+ module = module->next;
+ }
+ return TRUE;
+}
+
#else /* !__ELF__ */
BOOL elf_find_section(struct image_file_map* fmap, const char* name,
More information about the wine-patches
mailing list