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