llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-lldb Author: Minsoo Choo (mchoo7) <details> <summary>Changes</summary> 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. --- Full diff: https://github.com/llvm/llvm-project/pull/183975.diff 2 Files Affected: - (modified) lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.cpp (+24) - (modified) lldb/source/Plugins/Process/FreeBSD-Kernel-Core/ProcessFreeBSDKernelCore.h (+2) ``````````diff 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(); `````````` </details> https://github.com/llvm/llvm-project/pull/183975 _______________________________________________ lldb-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/lldb-commits
