From bb53152faab705d972de3763ddd9bb3351e92460 Mon Sep 17 00:00:00 2001 From: Zebediah Figura Date: Mon, 4 Jun 2018 16:51:31 -0500 Subject: [PATCH] dbghelp: Read the Elf_Dyn struct corresponding to the target's architecture. Signed-off-by: Zebediah Figura Signed-off-by: Alexandre Julliard --- 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 f84df836da6..2b444f8b015 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 395146446e7..a0df390f8ee 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