forked from OSchip/llvm-project
Change DynamicLoaderDarwinKernel::OSKextLoadedKextSummary to use
the Symbols::LocateExecutableObjectFile method to locate kexts and kernels instead of copying them out of the memory of the remote system. This is the fix for <rdar://problem/12416384>. Fix a variable shadowing problem in Symbols::LocateMacOSXFilesUsingDebugSymbols which caused the symbol rich executable binaries to not be found even if they were listed in the dSYM Info.plist. Change Symbols::DownloadObjectAndSymbolFile to ignore dsymForUUID's negative cache - this is typically being called by the user and we should try even if there's a incorrect entry in the negative cache. llvm-svn: 165061
This commit is contained in:
parent
c8e25d98c0
commit
743e439608
|
@ -378,7 +378,7 @@ LocateMacOSXFilesUsingDebugSymbols
|
|||
char uuid_cstr_buf[64];
|
||||
const char *uuid_cstr = uuid->GetAsCString (uuid_cstr_buf, sizeof(uuid_cstr_buf));
|
||||
CFCString uuid_cfstr (uuid_cstr);
|
||||
CFDictionaryRef uuid_dict = static_cast<CFDictionaryRef>(::CFDictionaryGetValue (dict.get(), uuid_cfstr.get()));
|
||||
uuid_dict = static_cast<CFDictionaryRef>(::CFDictionaryGetValue (dict.get(), uuid_cfstr.get()));
|
||||
if (uuid_dict)
|
||||
{
|
||||
|
||||
|
@ -693,9 +693,9 @@ Symbols::DownloadObjectAndSymbolFile (ModuleSpec &module_spec)
|
|||
|
||||
StreamString command;
|
||||
if (uuid_cstr)
|
||||
command.Printf("%s --copyExecutable %s", g_dsym_for_uuid_exe_path, uuid_cstr);
|
||||
command.Printf("%s --ignoreNegativeCache --copyExecutable %s", g_dsym_for_uuid_exe_path, uuid_cstr);
|
||||
else if (file_path && file_path[0])
|
||||
command.Printf("%s --copyExecutable %s", g_dsym_for_uuid_exe_path, file_path);
|
||||
command.Printf("%s --ignoreNegativeCache --copyExecutable %s", g_dsym_for_uuid_exe_path, file_path);
|
||||
|
||||
if (!command.GetString().empty())
|
||||
{
|
||||
|
|
|
@ -289,16 +289,15 @@ DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageUsingMemoryModule (
|
|||
module_sp.reset(); // UUID mismatch
|
||||
}
|
||||
|
||||
// If this is the kernel, see if we can locate a copy of the binary based on the UUID (and maybe even debug info)
|
||||
// FIXME: Symbols::DownloadObjectAndSymbolFile is forcing the download of the binaries via dsymForUUID regardless
|
||||
// of the current pref settings; don't want to do this for all the kexts unless the user has enabled it..
|
||||
if (!module_sp && memory_module_is_kernel)
|
||||
// Try to locate the kext/kernel binary on the local filesystem, maybe with additional
|
||||
// debug info/symbols still present, before we resort to copying it out of memory.
|
||||
if (!module_sp)
|
||||
{
|
||||
ModuleSpec sym_spec;
|
||||
sym_spec.GetUUID() = memory_module_sp->GetUUID();
|
||||
if (Symbols::DownloadObjectAndSymbolFile (sym_spec)
|
||||
&& sym_spec.GetArchitecture().IsValid()
|
||||
&& sym_spec.GetSymbolFileSpec().Exists())
|
||||
if (Symbols::LocateExecutableObjectFile (sym_spec)
|
||||
&& sym_spec.GetArchitecture().IsValid()
|
||||
&& sym_spec.GetFileSpec().Exists())
|
||||
{
|
||||
module_sp = target.GetSharedModule (sym_spec);
|
||||
if (module_sp.get ())
|
||||
|
@ -354,9 +353,16 @@ DynamicLoaderDarwinKernel::OSKextLoadedKextSummary::LoadImageUsingMemoryModule (
|
|||
char uuidbuf[64];
|
||||
s->Printf ("Kernel UUID: %s\n", module_sp->GetUUID().GetAsCString(uuidbuf, sizeof (uuidbuf)));
|
||||
s->Printf ("Load Address: 0x%llx\n", address);
|
||||
s->Printf ("Loaded kernel file %s/%s\n",
|
||||
module_sp->GetFileSpec().GetDirectory().AsCString(),
|
||||
module_sp->GetFileSpec().GetFilename().AsCString());
|
||||
if (module_sp->GetFileSpec().GetDirectory().IsEmpty())
|
||||
{
|
||||
s->Printf ("Loaded kernel file %s\n", module_sp->GetFileSpec().GetFilename().AsCString());
|
||||
}
|
||||
else
|
||||
{
|
||||
s->Printf ("Loaded kernel file %s/%s\n",
|
||||
module_sp->GetFileSpec().GetDirectory().AsCString(),
|
||||
module_sp->GetFileSpec().GetFilename().AsCString());
|
||||
}
|
||||
s->Flush ();
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue