mirror of
https://github.com/reactos/wine.git
synced 2024-11-25 12:49:45 +00:00
dbghelp: For Mach-O, get the address of the process's image info from its PEB.
This commit is contained in:
parent
22cf68e1bc
commit
1577fb6c3f
@ -24,6 +24,8 @@
|
||||
#include "config.h"
|
||||
#include "wine/port.h"
|
||||
|
||||
#include "ntstatus.h"
|
||||
#define WIN32_NO_STATUS
|
||||
#include "dbghelp_private.h"
|
||||
|
||||
#ifdef HAVE_MACH_O_LOADER_H
|
||||
@ -964,23 +966,52 @@ static BOOL macho_load_file(struct process* pcs, const WCHAR* filename,
|
||||
*/
|
||||
if (macho_info->flags & MACHO_INFO_DEBUG_HEADER)
|
||||
{
|
||||
static void* dyld_all_image_infos_addr;
|
||||
PROCESS_BASIC_INFORMATION pbi;
|
||||
NTSTATUS status;
|
||||
|
||||
/* This symbol should be in the same place in all processes. */
|
||||
if (!dyld_all_image_infos_addr)
|
||||
ret = FALSE;
|
||||
|
||||
/* Get address of PEB */
|
||||
status = NtQueryInformationProcess(pcs->handle, ProcessBasicInformation,
|
||||
&pbi, sizeof(pbi), NULL);
|
||||
if (status == STATUS_SUCCESS)
|
||||
{
|
||||
struct nlist nl[2];
|
||||
memset(nl, 0, sizeof(nl));
|
||||
nl[0].n_un.n_name = (char*)"_dyld_all_image_infos";
|
||||
if (!nlist("/usr/lib/dyld", nl))
|
||||
dyld_all_image_infos_addr = (void*)nl[0].n_value;
|
||||
ULONG dyld_image_info;
|
||||
|
||||
/* Read dyld image info address from PEB */
|
||||
if (ReadProcessMemory(pcs->handle, &pbi.PebBaseAddress->Reserved,
|
||||
&dyld_image_info, sizeof(dyld_image_info), NULL))
|
||||
{
|
||||
TRACE("got dyld_image_info 0x%08x from PEB %p MacDyldImageInfo %p\n",
|
||||
dyld_image_info, pbi.PebBaseAddress, &pbi.PebBaseAddress->Reserved);
|
||||
macho_info->dbg_hdr_addr = dyld_image_info;
|
||||
ret = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
if (dyld_all_image_infos_addr)
|
||||
macho_info->dbg_hdr_addr = (unsigned long)dyld_all_image_infos_addr;
|
||||
else
|
||||
ret = FALSE;
|
||||
TRACE("dbg_hdr_addr = 0x%08lx\n", macho_info->dbg_hdr_addr);
|
||||
if (!ret)
|
||||
{
|
||||
static void* dyld_all_image_infos_addr;
|
||||
|
||||
/* Our next best guess is that dyld was loaded at its base address
|
||||
and we can find the dyld image infos address by looking up its symbol. */
|
||||
if (!dyld_all_image_infos_addr)
|
||||
{
|
||||
struct nlist nl[2];
|
||||
memset(nl, 0, sizeof(nl));
|
||||
nl[0].n_un.n_name = (char*)"_dyld_all_image_infos";
|
||||
if (!nlist("/usr/lib/dyld", nl))
|
||||
dyld_all_image_infos_addr = (void*)nl[0].n_value;
|
||||
}
|
||||
|
||||
if (dyld_all_image_infos_addr)
|
||||
{
|
||||
TRACE("got dyld_image_info %p from /usr/lib/dyld symbol table\n",
|
||||
dyld_all_image_infos_addr);
|
||||
macho_info->dbg_hdr_addr = (unsigned long)dyld_all_image_infos_addr;
|
||||
ret = TRUE;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (macho_info->flags & MACHO_INFO_MODULE)
|
||||
|
Loading…
Reference in New Issue
Block a user