[PATCH 2/5] dbghelp: Read the Elf_Dyn struct corresponding to the target's architecture.

Zebediah Figura zfigura at codeweavers.com
Mon Jun 4 16:51:31 CDT 2018


Signed-off-by: Zebediah Figura <zfigura at codeweavers.com>
---
 dlls/dbghelp/elf_module.c    | 59 ++++++++++++++++++++++++++++++++------------
 dlls/dbghelp/image_private.h |  2 --
 2 files changed, 43 insertions(+), 18 deletions(-)

diff --git a/dlls/dbghelp/elf_module.c b/dlls/dbghelp/elf_module.c
index f84df83..2b444f8 100644
--- a/dlls/dbghelp/elf_module.c
+++ b/dlls/dbghelp/elf_module.c
@@ -1270,29 +1270,56 @@ static BOOL elf_load_file_from_fmap(struct process* pcs, const WCHAR* filename,
 
         if (elf_find_section(fmap, ".dynamic", SHT_DYNAMIC, &ism))
         {
-            Elf_Dyn         dyn;
             char*           ptr = (char*)(ULONG_PTR)fmap->u.elf.sect[ism.sidx].shdr.sh_addr;
             unsigned long   len;
 
             if (load_offset) ptr += load_offset - fmap->u.elf.elf_start;
 
-            do
+            if (fmap->addr_size == 32)
             {
-                if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
-                    len != sizeof(dyn))
-                    return ret;
-                if (dyn.d_tag == DT_DEBUG)
+                Elf32_Dyn dyn;
+
+                do
                 {
-                    elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
-                    if (load_offset == 0 && dyn_addr == 0) /* likely the case */
-                        /* Assume this module (the Wine loader) has been loaded at its preferred address */
-                        dyn_addr = ism.fmap->u.elf.sect[ism.sidx].shdr.sh_addr;
-                    break;
-                }
-                ptr += sizeof(dyn);
-            } while (dyn.d_tag != DT_NULL);
-            if (dyn.d_tag == DT_NULL) return ret;
-	}
+                    if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
+                        len != sizeof(dyn))
+                        return ret;
+                    if (dyn.d_tag == DT_DEBUG)
+                    {
+                        elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
+                        if (load_offset == 0 && dyn_addr == 0) /* likely the case */
+                            /* Assume this module (the Wine loader) has been
+                             * loaded at its preferred address */
+                            dyn_addr = ism.fmap->u.elf.sect[ism.sidx].shdr.sh_addr;
+                        break;
+                    }
+                    ptr += sizeof(dyn);
+                } while (dyn.d_tag != DT_NULL);
+                if (dyn.d_tag == DT_NULL) return ret;
+            }
+            else
+            {
+                Elf64_Dyn dyn;
+
+                do
+                {
+                    if (!ReadProcessMemory(pcs->handle, ptr, &dyn, sizeof(dyn), &len) ||
+                        len != sizeof(dyn))
+                        return ret;
+                    if (dyn.d_tag == DT_DEBUG)
+                    {
+                        elf_info->dbg_hdr_addr = dyn.d_un.d_ptr;
+                        if (load_offset == 0 && dyn_addr == 0) /* likely the case */
+                            /* Assume this module (the Wine loader) has been
+                             * loaded at its preferred address */
+                            dyn_addr = ism.fmap->u.elf.sect[ism.sidx].shdr.sh_addr;
+                        break;
+                    }
+                    ptr += sizeof(dyn);
+                } while (dyn.d_tag != DT_NULL);
+                if (dyn.d_tag == DT_NULL) return ret;
+            }
+        }
         elf_end_find(fmap);
     }
 
diff --git a/dlls/dbghelp/image_private.h b/dlls/dbghelp/image_private.h
index 3951464..a0df390 100644
--- a/dlls/dbghelp/image_private.h
+++ b/dlls/dbghelp/image_private.h
@@ -59,11 +59,9 @@ typedef struct section              macho_section;
 #ifdef __ELF__
 
 #ifdef _WIN64
-#define         Elf_Dyn         Elf64_Dyn
 #define         Elf_Sym         Elf64_Sym
 #define         Elf_auxv_t      Elf64_auxv_t
 #else
-#define         Elf_Dyn         Elf32_Dyn
 #define         Elf_Sym         Elf32_Sym
 #define         Elf_auxv_t      Elf32_auxv_t
 #endif
-- 
2.7.4




More information about the wine-devel mailing list