diff --git a/dll/win32/dbghelp/elf_module.c b/dll/win32/dbghelp/elf_module.c index f84df836da6..2b444f8b015 100644 --- a/dll/win32/dbghelp/elf_module.c +++ b/dll/win32/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/dll/win32/dbghelp/image_private.h b/dll/win32/dbghelp/image_private.h index 868d346abdb..22e81ae3e01 100644 --- a/dll/win32/dbghelp/image_private.h +++ b/dll/win32/dbghelp/image_private.h @@ -61,11 +61,9 @@ typedef struct section macho_section; #if defined(__ELF__) && !defined(DBGHELP_STATIC_LIB) #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 diff --git a/sdk/tools/winesync/dbghelp.cfg b/sdk/tools/winesync/dbghelp.cfg index ed6da1caf6a..15733bdd51b 100644 --- a/sdk/tools/winesync/dbghelp.cfg +++ b/sdk/tools/winesync/dbghelp.cfg @@ -3,4 +3,4 @@ directories: files: include/dbghelp.h: sdk/include/psdk/dbghelp.h tags: - wine: bd620ffb443eaa2dba997dc5597cb37c44d757b7 + wine: bb53152faab705d972de3763ddd9bb3351e92460