[Lldb-commits] [lldb] [llvm] [lldb][Process/FreeBSDKernelCore] Set kernel displacement (PR #183975)
Minsoo Choo via lldb-commits
lldb-commits at lists.llvm.org
Thu Mar 12 10:40:07 PDT 2026
https://github.com/mchoo7 updated https://github.com/llvm/llvm-project/pull/183975
>From af81454d1d1fa8519729e3c9db3162950535aa5a Mon Sep 17 00:00:00 2001
From: Minsoo Choo <minsoochoo0122 at proton.me>
Date: Sat, 28 Feb 2026 22:11:06 -0500
Subject: [PATCH 1/4] [lldb][Process/FreeBSDKernelCore] Load core according to
KASLR
Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
---
.../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<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();
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 <minsoochoo0122 at proton.me>
Date: Mon, 2 Mar 2026 10:59:25 -0500
Subject: [PATCH 2/4] fixup! [lldb][Process/FreeBSDKernelCore] Load core
according to KASLR
Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
---
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 <minsoochoo0122 at proton.me>
Date: Wed, 4 Mar 2026 10:28:58 -0500
Subject: [PATCH 3/4] fixup! [lldb][Process/FreeBSDKernelCore] Load core
according to KASLR
Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
---
.../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 8da122876c97f92e34d305dd8929b7861fd624db Mon Sep 17 00:00:00 2001
From: Minsoo Choo <minsoochoo0122 at proton.me>
Date: Thu, 12 Mar 2026 13:37:06 -0400
Subject: [PATCH 4/4] fixup! [lldb][Process/FreeBSDKernelCore] Load core
according to KASLR
Signed-off-by: Minsoo Choo <minsoochoo0122 at proton.me>
---
.../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..f5e4e7ef5e8d0 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<lldb::addr_t>(displacement), true, changed);
+ // Set offset (or displacement), not absolute address value
+ kernel_module_sp->SetLoadAddress(target,
+ static_cast<lldb::addr_t>(displacement),
+ /*value_is_offset*/ true, changed);
if (changed) {
ModuleList loaded_module_list;
More information about the lldb-commits
mailing list