[Lldb-commits] [PATCH] D137807: When scanning mach-o corefile, don't run all DynamicLoader plugins letting one of them Create when searching for binaries
Jason Molenda via Phabricator via lldb-commits
lldb-commits at lists.llvm.org
Thu Nov 10 15:39:04 PST 2022
jasonmolenda created this revision.
jasonmolenda added a reviewer: JDevlieghere.
jasonmolenda added a project: LLDB.
Herald added a project: All.
jasonmolenda requested review of this revision.
Herald added a subscriber: lldb-commits.
In https://reviews.llvm.org/D133680 I changed a lot of how ProcessMachCore scans a corefile to figure out what kind of debug session this is (kernel, firmware, userland, etc) and where the binaries are. `ProcessMachCore::LoadBinariesViaMetadata()` calls `ObjectFile::LoadCoreFileImages()`, and under there, it is possible that the Process DynamicLoader will be set in the process of its scans. Then back in `LoadBinariesViaMetadata()` it would check to see if the dynamic loader had been set. It would do this by calling `ProcessMachCore::GetDynamicLoader()`, but this method, if `m_dyld_up` is empty, will call the plugin interface `FindPlugin` method with the minimal amount of information we have so far --- and pick the wrong dynamic loader plugin for a userland process.
This broke userland corefile loading in lldb; no the DynamicLoaderMacOSX plugin is not loaded, so we don't load any of the binaries in the corfile. It's not a very commonly used type of corefile on Darwin systems, so it slipped by. The corefiles created by lldb's `process save-core` include a lot of metadata which make this work correctly for them, so it didn't get caught by the testsuite.
The fix is to change the call to `GetDynamicLoader()` which can *set* the dynamic loader, and instead look at the ivar. This is the only call to this method inside ProcessMachCore's methods.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D137807
Files:
lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp
Index: lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp
===================================================================
--- lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp
+++ lldb/source/Plugins/Process/mach-core/ProcessMachCore.cpp
@@ -327,9 +327,11 @@
// corefile
core_objfile->LoadCoreFileImages(*this);
- // LoadCoreFileImges may have set the dynamic loader; if we now have
- // a dynamic loader, save its name so we don't un-set it later.
- if (GetDynamicLoader())
+ // LoadCoreFileImges may have set the dynamic loader, e.g. in
+ // PlatformDarwinKernel::LoadPlatformBinaryAndSetup().
+ // If we now have a dynamic loader, save its name so we don't
+ // un-set it later.
+ if (m_dyld_up.get())
m_dyld_plugin_name = GetDynamicLoader()->GetPluginName();
}
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D137807.474622.patch
Type: text/x-patch
Size: 809 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/lldb-commits/attachments/20221110/c9c7cbb1/attachment.bin>
More information about the lldb-commits
mailing list