diff --git a/lldb/source/Target/Platform.cpp b/lldb/source/Target/Platform.cpp --- a/lldb/source/Target/Platform.cpp +++ b/lldb/source/Target/Platform.cpp @@ -1580,21 +1580,29 @@ if (error.Success() && module_sp) break; } - if (module_sp) + if (module_sp) { + resolved_module_spec = arch_module_spec; got_module_spec = true; + } } if (!got_module_spec) { // Get module information from a target. - if (!GetModuleSpec(module_spec.GetFileSpec(), module_spec.GetArchitecture(), - resolved_module_spec)) { + if (GetModuleSpec(module_spec.GetFileSpec(), module_spec.GetArchitecture(), + resolved_module_spec)) { if (!module_spec.GetUUID().IsValid() || module_spec.GetUUID() == resolved_module_spec.GetUUID()) { - return module_resolver(module_spec); + got_module_spec = true; } } } + if (!got_module_spec) { + // Fall back to the given module resolver, which may have its own + // search logic. + return module_resolver(module_spec); + } + // If we are looking for a specific UUID, make sure resolved_module_spec has // the same one before we search. if (module_spec.GetUUID().IsValid()) { diff --git a/lldb/test/API/functionalities/postmortem/minidump-new/TestMiniDumpNew.py b/lldb/test/API/functionalities/postmortem/minidump-new/TestMiniDumpNew.py --- a/lldb/test/API/functionalities/postmortem/minidump-new/TestMiniDumpNew.py +++ b/lldb/test/API/functionalities/postmortem/minidump-new/TestMiniDumpNew.py @@ -455,3 +455,29 @@ check_region(17, 0x40169000, 0x4016b000, True, True, False, True, d) check_region(18, 0x4016b000, 0x40176000, True, True, False, True, n) check_region(-1, 0x40176000, max_int, False, False, False, False, n) + + @skipIfLLVMTargetMissing("X86") + def test_minidump_sysroot(self): + """Test that lldb can find a module referenced in an i386 linux minidump using the sysroot.""" + + # Copy linux-x86_64 executable to tmp_sysroot/temp/test/ (since it was compiled as + # /tmp/test/linux-x86_64) + tmp_sysroot = os.path.join( + self.getBuildDir(), "lldb_i386_mock_sysroot") + executable = os.path.join( + tmp_sysroot, "tmp", "test", "linux-x86_64") + exe_dir = os.path.dirname(executable) + lldbutil.mkdir_p(exe_dir) + shutil.copyfile("linux-x86_64", executable) + + # Set sysroot and load core + self.runCmd("platform select remote-linux --sysroot '%s'" % + tmp_sysroot) + self.process_from_yaml("linux-x86_64.yaml") + self.check_state() + + # Check that we loaded the module from the sysroot + self.assertEqual(self.target.GetNumModules(), 1) + module = self.target.GetModuleAtIndex(0) + spec = module.GetFileSpec() + self.assertEqual(spec.GetDirectory(), exe_dir)