dbghelp: Split gnu_debuglink handling into own function.
Frank Richter
frank.richter at gmail.com
Thu Jan 11 09:29:27 CST 2007
-------------- next part --------------
>From e4c510778cf5e4d3d63198c00588b3a6609ddd23 Mon Sep 17 00:00:00 2001
From: Frank Richter frank.richter at gmail.com <frank.richter at gmail.com>
Date: Thu, 11 Jan 2007 16:27:04 +0100
Subject: [PATCH] dbghelp: Split gnu_debuglink handling into own function.
---
dlls/dbghelp/elf_module.c | 77 +++++++++++++++++++++++++++++++-------------
1 files changed, 54 insertions(+), 23 deletions(-)
diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index 61d7edb..0cfa84f 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -778,6 +778,51 @@ static DWORD calc_crc32(struct elf_file_map* fmap)
#undef UPDC32
}
+static BOOL elf_load_debug_info_from_map(struct module* module,
+ struct elf_file_map* fmap,
+ struct pool* pool,
+ struct hash_table* ht_symtab);
+
+/******************************************************************
+ * elf_debuglink_parse
+ *
+ * Parses a .gnu_debuglink section and loads the debug info from
+ * the external file specified there.
+ */
+static BOOL elf_debuglink_parse (struct module* module,
+ struct pool* pool,
+ struct hash_table* ht_symtab,
+ const BYTE* debuglink)
+{
+ /* The content of a debug link section is:
+ * 1/ a NULL terminated string, containing the file name for the
+ * debug info
+ * 2/ padding on 4 byte boundary
+ * 3/ CRC of the linked ELF file
+ */
+ BOOL ret = FALSE, lret;
+ const char* dbg_link = (char*)debuglink;
+ struct elf_file_map fmap_link;
+
+ if (elf_map_file(dbg_link, &fmap_link))
+ {
+ fmap_link.crc = *(const DWORD*)(dbg_link + ((DWORD_PTR)(strlen(dbg_link) + 4) & ~3));
+ fmap_link.with_crc = 1;
+ lret = elf_load_debug_info_from_map(module, &fmap_link, pool,
+ ht_symtab);
+ if (lret)
+ strcpy(module->module.LoadedPdbName, dbg_link);
+ else
+ WARN("Couldn't load debug information from %s\n", dbg_link);
+ ret = ret || lret;
+ elf_unmap_file(&fmap_link);
+ }
+ else
+ WARN("Couldn't map %s\n", dbg_link);
+
+ return ret;
+}
+
/******************************************************************
* elf_load_debug_info_from_map
*
@@ -943,32 +988,18 @@ static BOOL elf_load_debug_info_from_map(struct module* module,
}
if (debuglink_sect != -1)
{
- const char* dbg_link;
- struct elf_file_map fmap_link;
-
- dbg_link = elf_map_section(fmap, debuglink_sect);
- /* The content of a debug link section is:
- * 1/ a NULL terminated string, containing the file name for the
- * debug info
- * 2/ padding on 4 byte boundary
- * 3/ CRC of the linked ELF file
- */
- if (dbg_link != ELF_NO_MAP && elf_map_file(dbg_link, &fmap_link))
+ const BYTE* dbg_link;
+
+ dbg_link = (const BYTE*) elf_map_section(fmap, debuglink_sect);
+ if (dbg_link != ELF_NO_MAP)
{
- fmap_link.crc = *(const DWORD*)(dbg_link + ((DWORD_PTR)(strlen(dbg_link) + 4) & ~3));
- fmap_link.with_crc = 1;
- lret = elf_load_debug_info_from_map(module, &fmap_link, pool,
- ht_symtab);
- if (lret)
- strcpy(module->module.LoadedPdbName, dbg_link);
- else
- WARN("Couldn't load debug information from %s\n", dbg_link);
+ lret = elf_debuglink_parse (module, pool, ht_symtab, dbg_link);
+ if (!lret)
+ WARN("Couldn't load linked debug file for %s\n",
+ module->module.ModuleName);
ret = ret || lret;
- elf_unmap_file(&fmap_link);
}
- else
- WARN("Couldn't load linked debug file for %s\n",
- module->module.ModuleName);
+ elf_unmap_section(fmap, debuglink_sect);
}
}
if (strstr(module->module.ModuleName, "<elf>") ||
--
1.4.4.3
More information about the wine-patches
mailing list