/****************************************************************** * macho_load_module * * Loads a Mach-O module and stores it in process' module list. * Also, find module real name and load address from * the real loaded modules list in pcs address space. */ struct module* macho_load_module(struct process* pcs, const WCHAR* name, unsigned long addr) { struct macho_load ml; TRACE("(%p/%p, %s, 0x%08lx)\n", pcs, pcs->handle, debugstr_w(name), addr); ml.macho_info.flags = MACHO_INFO_MODULE; ml.ret = FALSE; if (pcs->dbg_hdr_addr) /* we're debugging a live target */ { ml.pcs = pcs; /* do only the lookup from the filename, not the path (as we lookup module * name in the process' loaded module list) */ ml.name = strrchrW(name, '/'); if (!ml.name++) ml.name = name; ml.ret = FALSE; if (!macho_enum_modules_internal(pcs, NULL, macho_load_cb, &ml)) return NULL; } else if (addr) { ml.name = name; ml.ret = macho_search_and_load_file(pcs, ml.name, addr, &ml.macho_info); } if (!ml.ret) return NULL; assert(ml.macho_info.module); return ml.macho_info.module; }
static BOOL macho_enum_sync_cb(const WCHAR* name, unsigned long addr, void* user) { struct macho_sync* ms = user; TRACE("(%s, 0x%08lx, %p)\n", debugstr_w(name), addr, user); macho_search_and_load_file(ms->pcs, name, addr, &ms->macho_info); return TRUE; }
/****************************************************************** * macho_search_loader * * Lookup in a running Mach-O process the loader, and sets its Mach-O link * address (for accessing the list of loaded images) in pcs. * If flags is MACHO_INFO_MODULE, the module for the loader is also * added as a module into pcs. */ static BOOL macho_search_loader(struct process* pcs, struct macho_info* macho_info) { BOOL ret; const char* ptr; TRACE("(%p/%p, %p)\n", pcs, pcs->handle, macho_info); /* All binaries are loaded with WINELOADER (if run from tree) or by the * main executable */ if ((ptr = getenv("WINELOADER"))) { WCHAR tmp[MAX_PATH]; MultiByteToWideChar(CP_UNIXCP, 0, ptr, -1, tmp, sizeof(tmp) / sizeof(WCHAR)); ret = macho_search_and_load_file(pcs, tmp, 0, macho_info); } else { ret = macho_search_and_load_file(pcs, S_WineW, 0, macho_info); } return ret; }
/****************************************************************** * macho_load_cb * * Callback for macho_load_module, used to walk the list of loaded * modules. */ static BOOL macho_load_cb(const WCHAR* name, unsigned long addr, void* user) { struct macho_load* ml = user; const WCHAR* p; TRACE("(%s, 0x%08lx, %p)\n", debugstr_w(name), addr, user); /* memcmp is needed for matches when bufstr contains also version information * ml->name: libc.so, name: libc.so.6.0 */ p = strrchrW(name, '/'); if (!p++) p = name; if (!memcmp(p, ml->name, lstrlenW(ml->name) * sizeof(WCHAR))) { ml->ret = macho_search_and_load_file(ml->pcs, name, addr, &ml->macho_info); return FALSE; } return TRUE; }
/****************************************************************** * macho_search_loader * * Lookup in a running Mach-O process the loader, and sets its Mach-O link * address (for accessing the list of loaded images) in pcs. * If flags is MACHO_INFO_MODULE, the module for the loader is also * added as a module into pcs. */ static BOOL macho_search_loader(struct process* pcs, struct macho_info* macho_info) { return macho_search_and_load_file(pcs, get_wine_loader_name(), 0, macho_info); }