From af81454d1d1fa8519729e3c9db3162950535aa5a Mon Sep 17 00:00:00 2001 From: Minsoo Choo Date: Sat, 28 Feb 2026 22:11:06 -0500 Subject: [PATCH 1/5] [lldb][Process/FreeBSDKernelCore] Load core according to KASLR Signed-off-by: Minsoo Choo --- .../ProcessFreeBSDKernelCore.cpp | 24 +++++++++++++++++++ .../ProcessFreeBSDKernelCore.h | 2 ++ llvm/docs/ReleaseNotes.md | 2 ++ 3 files changed, 28 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(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(); diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index 2e0c5c5cb9370..86d4669e37db5 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -230,6 +230,8 @@ Changes to LLDB `plugin.process.freebsd-kernel-core.read-only` must be set to `false`. This setting is available when using `/dev/mem` or a kernel dump. However, since `kvm_write()` does not support writing to kernel dumps, writes to a kernel dump will still fail when the setting is false. +* Debugging core with KASLR applied is now supported. Note that this doesn't work for some crash dumps due to + kvm's limitation. ### Linux From 891e8661ac889728e60e34b6cdb97d2ffdc0fd56 Mon Sep 17 00:00:00 2001 From: Minsoo Choo Date: Mon, 2 Mar 2026 10:59:25 -0500 Subject: [PATCH 2/5] fixup! [lldb][Process/FreeBSDKernelCore] Load core according to KASLR Signed-off-by: Minsoo Choo --- llvm/docs/ReleaseNotes.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index 86d4669e37db5..dcb13069abc6c 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -230,8 +230,8 @@ Changes to LLDB `plugin.process.freebsd-kernel-core.read-only` must be set to `false`. This setting is available when using `/dev/mem` or a kernel dump. However, since `kvm_write()` does not support writing to kernel dumps, writes to a kernel dump will still fail when the setting is false. -* Debugging core with KASLR applied is now supported. Note that this doesn't work for some crash dumps due to - kvm's limitation. +* Debugging core with KASLR applied is now supported. Note that this does not work for some crash dumps due to + kvm's limitations. ### Linux From 2f8efb7a7dc259b84b1d0dbe38cf861c4e8ff953 Mon Sep 17 00:00:00 2001 From: Minsoo Choo Date: Wed, 4 Mar 2026 10:28:58 -0500 Subject: [PATCH 3/5] fixup! [lldb][Process/FreeBSDKernelCore] Load core according to KASLR Signed-off-by: Minsoo Choo --- .../Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp | 4 ++-- .../Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h | 2 +- llvm/docs/ReleaseNotes.md | 2 -- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp index 0217177c87dbd..d2f663f810bfe 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp @@ -118,7 +118,7 @@ bool ProcessFreeBSDKernelCore::CanDebug(lldb::TargetSP target_sp, Status ProcessFreeBSDKernelCore::DoLoadCore() { // The core is already loaded by CreateInstance(). - ApplyKASLR(); + SetKernelDisplacement(); return Status(); } @@ -326,7 +326,7 @@ lldb::addr_t ProcessFreeBSDKernelCore::FindSymbol(const char *name) { return sym ? sym->GetLoadAddress(&GetTarget()) : LLDB_INVALID_ADDRESS; } -void ProcessFreeBSDKernelCore::ApplyKASLR() { +void ProcessFreeBSDKernelCore::SetKernelDisplacement() { kssize_t displacement = kvm_kerndisp(m_kvm); if (displacement == 0) diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h index 92ddec4696066..d82e55ea74bd9 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h @@ -64,7 +64,7 @@ class ProcessFreeBSDKernelCore : public lldb_private::PostMortemProcess { lldb::addr_t FindSymbol(const char *name); private: - void ApplyKASLR(); + void SetKernelDisplacement(); void PrintUnreadMessage(); diff --git a/llvm/docs/ReleaseNotes.md b/llvm/docs/ReleaseNotes.md index dcb13069abc6c..2e0c5c5cb9370 100644 --- a/llvm/docs/ReleaseNotes.md +++ b/llvm/docs/ReleaseNotes.md @@ -230,8 +230,6 @@ Changes to LLDB `plugin.process.freebsd-kernel-core.read-only` must be set to `false`. This setting is available when using `/dev/mem` or a kernel dump. However, since `kvm_write()` does not support writing to kernel dumps, writes to a kernel dump will still fail when the setting is false. -* Debugging core with KASLR applied is now supported. Note that this does not work for some crash dumps due to - kvm's limitations. ### Linux From 574a83644d768cb17f2b3ea98774a9be91c8b1e7 Mon Sep 17 00:00:00 2001 From: Minsoo Choo Date: Thu, 12 Mar 2026 13:37:06 -0400 Subject: [PATCH 4/5] fixup! [lldb][Process/FreeBSDKernelCore] Load core according to KASLR Signed-off-by: Minsoo Choo --- .../FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp index d2f663f810bfe..da25225f4ab07 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp @@ -338,8 +338,10 @@ void ProcessFreeBSDKernelCore::SetKernelDisplacement() { return; bool changed = false; - kernel_module_sp->SetLoadAddress( - target, static_cast(displacement), true, changed); + // Set offset (or displacement), not absolute address value. + kernel_module_sp->SetLoadAddress(target, + static_cast(displacement), + /*value_is_offset*/ true, changed); if (changed) { ModuleList loaded_module_list; From e0e0236e6b51dba7d1a153ae8b15a9d8861fb84a Mon Sep 17 00:00:00 2001 From: Minsoo Choo Date: Fri, 13 Mar 2026 14:31:36 -0400 Subject: [PATCH 5/5] fixup! [lldb][Process/FreeBSDKernelCore] Load core according to KASLR Signed-off-by: Minsoo Choo --- .../Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp index da25225f4ab07..bf91074716237 100644 --- a/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp +++ b/lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp @@ -338,10 +338,9 @@ void ProcessFreeBSDKernelCore::SetKernelDisplacement() { return; bool changed = false; - // Set offset (or displacement), not absolute address value. kernel_module_sp->SetLoadAddress(target, static_cast(displacement), - /*value_is_offset*/ true, changed); + /*value_is_offset=*/true, changed); if (changed) { ModuleList loaded_module_list;