Am 29.08.2013 22:46, schrieb Charles Davis:
On Aug 29, 2013, at 2:35 PM, André Hentschel wrote:
Am 29.08.2013 19:52, schrieb André Hentschel:
Hi,
thank you both for the comments, i'll see what i can do.
How about that?
Much better, but...
diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c
index c0b86ba..0667ad7 100644
--- a/programs/winedbg/info.c
+++ b/programs/winedbg/info.c
@@ -244,6 +244,11 @@ void info_win32_module(DWORD64 base)
}
}
}
+ else if (strstr(im.mi[i].ModuleName, "<mach-o>"))
+ {
+ dbg_printf("Mach-O\t");
+ module_print_info(&im.mi[i], FALSE);
If there are any modules
embedded in a Mach-O file (i.e. the PE DLLs embedded in a Wine built-in DLL), this will no
longer print them.
Oops, true.
changes since last one:
dbg_printf("Mach-O\t");
module_print_info(&im.mi[i], FALSE);
+ /* print all modules embedded in this one */
+ for (j = 0; j < im.num_used; j++)
+ {
+ if (!strstr(im.mi[j].ModuleName, "<mach-o>") &&
module_is_container(&im.mi[i], &im.mi[j]))
+ {
+ dbg_printf(" \\-PE\t");
+ module_print_info(&im.mi[j], TRUE);
+ }
+ }
}
else
{
/* check module is not embedded in another module */
for (j = 0; j < im.num_used; j++)
{
- if (strstr(im.mi[j].ModuleName, "<elf>") &&
module_is_container(&im.mi[j], &im.mi[i]))
+ if ((strstr(im.mi[j].ModuleName, "<elf>") ||
strstr(im.mi[j].ModuleName, "<mach-o>")) &&
+ module_is_container(&im.mi[j], &im.mi[i]))
break;
Could you test that please? Maybe some ideas regarding code duplication?
diff --git a/dlls/dbghelp/module.c b/dlls/dbghelp/module.c
index 6bea436..ed1d9c0 100644
--- a/dlls/dbghelp/module.c
+++ b/dlls/dbghelp/module.c
@@ -33,6 +33,7 @@
WINE_DEFAULT_DEBUG_CHANNEL(dbghelp);
const WCHAR S_ElfW[] =
{'<','e','l','f','>','\0'};
+const WCHAR S_MachoW[] =
{'<','m','a','c','h','-','o','>','\0'};
const WCHAR S_WineLoaderW[] =
{'<','w','i','n','e','-','l','o','a','d','e','r','>','\0'};
static const WCHAR S_DotSoW[] =
{'.','s','o','\0'};
static const WCHAR S_DotDylibW[] =
{'.','d','y','l','i','b','\0'};
@@ -89,12 +90,19 @@ static void module_fill_module(const WCHAR* in, WCHAR* out, size_t
size)
out[len - l] = '\0';
else if (len > strlenW(loader) && !strcmpiW(out + len - strlenW(loader),
loader))
lstrcpynW(out, S_WineLoaderW, size);
- else
- {
- if (len > 3 && !strcmpiW(&out[len - 3], S_DotSoW) &&
- (l = match_ext(out, len - 3)))
- strcpyW(&out[len - l - 3], S_ElfW);
- }
+ else if (len > 3 && !strcmpiW(&out[len - 3], S_DotSoW) && (l =
match_ext(out, len - 3)))
+ switch (module_get_type_by_name(out))
+ {
+ case DMT_ELF:
+ strcpyW(&out[len - l - 3], S_ElfW);
+ break;
+ case DMT_MACHO:
+ strcpyW(&out[len - l - 3], S_MachoW);
+ break;
+ default:
+ break;
+ }
+
while ((*out = tolowerW(*out))) out++;
}
diff --git a/programs/winedbg/info.c b/programs/winedbg/info.c
index c0b86ba..79cadc0 100644
--- a/programs/winedbg/info.c
+++ b/programs/winedbg/info.c
@@ -244,16 +244,39 @@ void info_win32_module(DWORD64 base)
}
}
}
+ else if (strstr(im.mi[i].ModuleName, "<mach-o>"))
+ {
+ dbg_printf("Mach-O\t");
+ module_print_info(&im.mi[i], FALSE);
+ /* print all modules embedded in this one */
+ for (j = 0; j < im.num_used; j++)
+ {
+ if (!strstr(im.mi[j].ModuleName, "<mach-o>") &&
module_is_container(&im.mi[i], &im.mi[j]))
+ {
+ dbg_printf(" \\-PE\t");
+ module_print_info(&im.mi[j], TRUE);
+ }
+ }
+ }
else
{
/* check module is not embedded in another module */
for (j = 0; j < im.num_used; j++)
{
- if (strstr(im.mi[j].ModuleName, "<elf>") &&
module_is_container(&im.mi[j], &im.mi[i]))
+ if ((strstr(im.mi[j].ModuleName, "<elf>") ||
strstr(im.mi[j].ModuleName, "<mach-o>")) &&
+ module_is_container(&im.mi[j], &im.mi[i]))
break;
}
if (j < im.num_used) continue;
- if (strstr(im.mi[i].ModuleName, ".so") ||
strchr(im.mi[i].ModuleName, '<'))
+ if (strstr(im.mi[i].ModuleName, "<wine-loader>"))
+#ifdef __APPLE__
+ dbg_printf("Mach-O\t");
+#else
+ dbg_printf("ELF\t");
+#endif
+ else if (strstr(im.mi[i].ModuleName, ".dylib") ||
strstr(im.mi[i].ModuleName, "<mach-o>"))
+ dbg_printf("Mach-O\t");
+ else if (strstr(im.mi[i].ModuleName, ".so") ||
strstr(im.mi[i].ModuleName, "<elf>"))
dbg_printf("ELF\t");
else
dbg_printf("PE\t");
diff --git a/programs/winedbg/symbol.c b/programs/winedbg/symbol.c
index 99b382d..b8092ae 100644
--- a/programs/winedbg/symbol.c
+++ b/programs/winedbg/symbol.c
@@ -779,6 +779,8 @@ static BOOL CALLBACK symbols_info_cb(PSYMBOL_INFO sym, ULONG size,
PVOID ctx)
size_t len = strlen(mi.ModuleName);
if (len > 5 && !strcmp(mi.ModuleName + len - 5,
"<elf>"))
mi.ModuleName[len - 5] = '\0';
+ else if (len > 8 && !strcmp(mi.ModuleName + len - 8,
"<mach-o>"))
+ mi.ModuleName[len - 8] = '\0';
}
dbg_printf("%08lx: %s!%s", (ULONG_PTR)sym->Address, mi.ModuleName,
sym->Name);