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