[Lldb-commits] [lldb] [lldb][FreeBSDKernel] Update kernel/kmod ELF type (PR #224847)

via lldb-commits lldb-commits at lists.llvm.org
Sat Sep 19 10:57:18 PDT 2026


llvmorg-github-actions[bot] wrote:


<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-lldb

Author: Minsoo Choo (mchoo7)

<details>
<summary>Changes</summary>

In FreeBSD, kernel and kmod are not always `ET_EXEC`/`ET_DYN`. A few exceptions exist:

- amd64's kmod is `ET_REL`
- ppc64 and ppc64le's kernel is `ET_DYN`

Reflect these in code that identifies if module is kernel, kmod, or relocatable object.

Fixes: b3cc4804d45d6b612ac9b3cc47ebbb0da44ebc60

---
Full diff: https://github.com/llvm/llvm-project/pull/224847.diff


1 Files Affected:

- (modified) lldb/source/Plugins/DynamicLoader/FreeBSD-Kernel/DynamicLoaderFreeBSDKernel.cpp (+59-12) 


``````````diff
diff --git a/lldb/source/Plugins/DynamicLoader/FreeBSD-Kernel/DynamicLoaderFreeBSDKernel.cpp b/lldb/source/Plugins/DynamicLoader/FreeBSD-Kernel/DynamicLoaderFreeBSDKernel.cpp
index 9a736c649fcc5..3ec6705a05de7 100644
--- a/lldb/source/Plugins/DynamicLoader/FreeBSD-Kernel/DynamicLoaderFreeBSDKernel.cpp
+++ b/lldb/source/Plugins/DynamicLoader/FreeBSD-Kernel/DynamicLoaderFreeBSDKernel.cpp
@@ -62,7 +62,25 @@ static bool is_kernel(Module *module) {
   ObjectFile *objfile = module->GetObjectFile();
   if (!objfile)
     return false;
-  if (objfile->GetType() != ObjectFile::eTypeExecutable)
+
+  ObjectFile::Type expected_type;
+  switch (module->GetArchitecture().GetMachine()) {
+  case llvm::Triple::x86:
+  case llvm::Triple::x86_64:
+  case llvm::Triple::arm:
+  case llvm::Triple::aarch64:
+  case llvm::Triple::riscv64:
+    expected_type = ObjectFile::eTypeExecutable;
+    break;
+  case llvm::Triple::ppc64:
+  case llvm::Triple::ppc64le:
+    expected_type = ObjectFile::eTypeSharedLibrary;
+    break;
+  default:
+    return false;
+  }
+
+  if (objfile->GetType() != expected_type)
     return false;
   if (objfile->GetStrata() != ObjectFile::eStrataUnknown &&
       objfile->GetStrata() != ObjectFile::eStrataKernel)
@@ -74,26 +92,40 @@ static bool is_kernel(Module *module) {
 static bool is_kmod(Module *module) {
   if (!module)
     return false;
-  if (!module->GetObjectFile())
-    return false;
+
   ObjectFile *objfile = module->GetObjectFile();
-  if (objfile->GetType() != ObjectFile::eTypeObjectFile &&
-      objfile->GetType() != ObjectFile::eTypeSharedLibrary)
+  if (!objfile)
     return false;
 
-  return true;
+  switch (module->GetArchitecture().GetMachine()) {
+  case llvm::Triple::x86_64:
+    return objfile->GetType() == ObjectFile::eTypeObjectFile;
+  case llvm::Triple::x86:
+  case llvm::Triple::arm:
+  case llvm::Triple::aarch64:
+  case llvm::Triple::riscv64:
+  case llvm::Triple::ppc64:
+  case llvm::Triple::ppc64le:
+    return objfile->GetType() == ObjectFile::eTypeSharedLibrary;
+  default:
+    return false;
+  }
 }
 
 static bool is_reloc(Module *module) {
   if (!module)
     return false;
-  if (!module->GetObjectFile())
-    return false;
+
   ObjectFile *objfile = module->GetObjectFile();
-  if (objfile->GetType() != ObjectFile::eTypeObjectFile)
+  if (!objfile)
     return false;
 
-  return true;
+  switch (module->GetArchitecture().GetMachine()) {
+  case llvm::Triple::x86_64:
+    return objfile->GetType() == ObjectFile::eTypeObjectFile;
+  default:
+    return false;
+  }
 }
 
 // Instantiate Function of the FreeBSD Kernel Dynamic Loader Plugin called when
@@ -203,8 +235,23 @@ lldb_private::UUID DynamicLoaderFreeBSDKernel::CheckForKernelImageAtAddress(
     return UUID();
   }
 
-  // Check header type
-  if (header.e_type != llvm::ELF::ET_EXEC)
+  uint16_t expected_type;
+  switch (header.e_machine) {
+  case llvm::ELF::EM_386:
+  case llvm::ELF::EM_X86_64:
+  case llvm::ELF::EM_ARM:
+  case llvm::ELF::EM_AARCH64:
+  case llvm::ELF::EM_RISCV:
+    expected_type = llvm::ELF::ET_EXEC;
+    break;
+  case llvm::ELF::EM_PPC64:
+    expected_type = llvm::ELF::ET_DYN;
+    break;
+  default:
+    return UUID();
+  }
+
+  if (header.e_type != expected_type)
     return UUID();
 
   llvm::Expected<ModuleSP> memory_module_sp_or_err =

``````````

</details>


https://github.com/llvm/llvm-project/pull/224847


More information about the lldb-commits mailing list