https://github.com/mchoo7 created https://github.com/llvm/llvm-project/pull/183975
When KASLR is enabled, the address passed through `kvm_read()`/`kvm_write()` is different from its real address. Thus LLDB should retrieve displacement offset using `kvm_kerndisp()` and pass the information through `SetLoadAddress()`. Note that some dump format on specific architectures don't support this, but this is due to kvm implementation and not LLDB's responsibility. >From ab4583c396384e06c9ed3ac5f17afac1f6b62bbd Mon Sep 17 00:00:00 2001 From: Minsoo Choo <[email protected]> Date: Sat, 28 Feb 2026 22:11:06 -0500 Subject: [PATCH] [lldb][Process/FreeBSDKernelCore] Load core according to KASLR Signed-off-by: Minsoo Choo <[email protected]> --- .../ProcessFreeBSDKernelCore.cpp | 24 +++++++++++++++++++ .../ProcessFreeBSDKernelCore.h | 2 ++ 2 files changed, 26 insertions(+) diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp index 577d8e0d50cf1..0217177c87dbd 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp @@ -118,6 +118,8 @@ bool ProcessFreeBSDKernelCore::CanDebug(lldb::TargetSP target_sp, Status ProcessFreeBSDKernelCore::DoLoadCore() { // The core is already loaded by CreateInstance(). + ApplyKASLR(); + return Status(); } @@ -324,6 +326,28 @@ lldb::addr_t ProcessFreeBSDKernelCore::FindSymbol(const char *name) { return sym ? sym->GetLoadAddress(&GetTarget()) : LLDB_INVALID_ADDRESS; } +void ProcessFreeBSDKernelCore::ApplyKASLR() { + kssize_t displacement = kvm_kerndisp(m_kvm); + + if (displacement == 0) + return; + + Target &target = GetTarget(); + lldb::ModuleSP kernel_module_sp = target.GetExecutableModule(); + if (!kernel_module_sp) + return; + + bool changed = false; + kernel_module_sp->SetLoadAddress( + target, static_cast<lldb::addr_t>(displacement), true, changed); + + if (changed) { + ModuleList loaded_module_list; + loaded_module_list.Append(kernel_module_sp); + target.ModulesDidLoad(loaded_module_list); + } +} + void ProcessFreeBSDKernelCore::PrintUnreadMessage() { Target &target = GetTarget(); Debugger &debugger = target.GetDebugger(); diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h index 67cfae13d2a4d..92ddec4696066 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h @@ -64,6 +64,8 @@ class ProcessFreeBSDKernelCore : public lldb_private::PostMortemProcess { lldb::addr_t FindSymbol(const char *name); private: + void ApplyKASLR(); + void PrintUnreadMessage(); const char *GetError(); _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
