[PATCH 2/3] [DbgHelp]: allowed to add an alternate file_map for an ELF file (where to

Eric Pouech eric.pouech at wanadoo.fr
Sat Feb 24 14:01:10 CST 2007


look for its debug information)

A+
---

 dlls/dbghelp/elf_module.c |   60 +++++++++++++++++++++++++++++----------------
 1 files changed, 38 insertions(+), 22 deletions(-)

diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index b0cc90c..4d15cb3 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -115,6 +115,7 @@ struct elf_file_map
     unsigned                    with_crc;
     unsigned long               crc;
     const char*	                shstrtab;
+    struct elf_file_map*        alternate;      /* another ELF file (linked to this one) */
 };
 
 struct elf_section_map
@@ -167,27 +168,32 @@ static const char* elf_map_section(struc
  *		elf_find_section
  *
  * Finds a section by name (and type) into memory from an ELF file
+ * or its alternate if any
  */
 static BOOL elf_find_section(struct elf_file_map* fmap, const char* name,
                              unsigned sht, struct elf_section_map* esm)
 {
     unsigned i;
 
-    if (fmap->shstrtab == ELF_NO_MAP)
+    while (fmap)
     {
-        struct elf_section_map  hdr_esm = {fmap, fmap->elfhdr.e_shstrndx};
-        fmap->shstrtab = elf_map_section(&hdr_esm);
-        if (fmap->shstrtab == ELF_NO_MAP) return FALSE;
-    }
-    for (i = 0; i < fmap->elfhdr.e_shnum; i++)
-    {
-	if (strcmp(fmap->shstrtab + fmap->sect[i].shdr.sh_name, name) == 0 &&
-            (sht == SHT_NULL || sht == fmap->sect[i].shdr.sh_type))
+        if (fmap->shstrtab == ELF_NO_MAP)
+        {
+            struct elf_section_map  hdr_esm = {fmap, fmap->elfhdr.e_shstrndx};
+            fmap->shstrtab = elf_map_section(&hdr_esm);
+            if (fmap->shstrtab == ELF_NO_MAP) return FALSE;
+        }
+        for (i = 0; i < fmap->elfhdr.e_shnum; i++)
         {
-            esm->fmap = fmap;
-            esm->sidx = i;
-	    return TRUE;
+            if (strcmp(fmap->shstrtab + fmap->sect[i].shdr.sh_name, name) == 0 &&
+                (sht == SHT_NULL || sht == fmap->sect[i].shdr.sh_type))
+            {
+                esm->fmap = fmap;
+                esm->sidx = i;
+                return TRUE;
+            }
         }
+        fmap = fmap->alternate;
     }
     return FALSE;
 }
@@ -217,9 +223,14 @@ static void elf_end_find(struct elf_file
 {
     struct elf_section_map      esm;
 
-    esm.fmap = fmap; esm.sidx = fmap->elfhdr.e_shstrndx;
-    elf_unmap_section(&esm);
-    fmap->shstrtab = ELF_NO_MAP;
+    while (fmap)
+    {
+        esm.fmap = fmap;
+        esm.sidx = fmap->elfhdr.e_shstrndx;
+        elf_unmap_section(&esm);
+        fmap->shstrtab = ELF_NO_MAP;
+        fmap = fmap->alternate;
+    }
 }
 
 /******************************************************************
@@ -257,6 +268,7 @@ static BOOL elf_map_file(const WCHAR* fi
     fmap->fd = -1;
     fmap->with_crc = 0;
     fmap->shstrtab = ELF_NO_MAP;
+    fmap->alternate = NULL;
 
     /* check that the file exists, and that the module hasn't been loaded yet */
     if (stat(filename, &statbuf) == -1 || S_ISDIR(statbuf.st_mode)) goto done;
@@ -312,16 +324,20 @@ done:
  */
 static void elf_unmap_file(struct elf_file_map* fmap)
 {
-    if (fmap->fd != -1)
+    while (fmap)
     {
-        struct elf_section_map  esm;
-        esm.fmap = fmap;
-        for (esm.sidx = 0; esm.sidx < fmap->elfhdr.e_shnum; esm.sidx++)
+        if (fmap->fd != -1)
         {
-            elf_unmap_section(&esm);
+            struct elf_section_map  esm;
+            esm.fmap = fmap;
+            for (esm.sidx = 0; esm.sidx < fmap->elfhdr.e_shnum; esm.sidx++)
+            {
+                elf_unmap_section(&esm);
+            }
+            HeapFree(GetProcessHeap(), 0, fmap->sect);
+            close(fmap->fd);
         }
-        HeapFree(GetProcessHeap(), 0, fmap->sect);
-        close(fmap->fd);
+        fmap = fmap->alternate;
     }
 }
 



More information about the wine-patches mailing list