[llvm] bcb5399 - [JITLink] Add a null-terminator to eh-frame sections on ELF/x86-64.
Lang Hames via llvm-commits
llvm-commits at lists.llvm.org
Tue Mar 9 22:16:20 PST 2021
Author: Lang Hames
Date: 2021-03-09T22:16:11-08:00
New Revision: bcb53999a4ce9a8236295a6abf8b3a3e8916a0f5
URL: https://github.com/llvm/llvm-project/commit/bcb53999a4ce9a8236295a6abf8b3a3e8916a0f5
DIFF: https://github.com/llvm/llvm-project/commit/bcb53999a4ce9a8236295a6abf8b3a3e8916a0f5.diff
LOG: [JITLink] Add a null-terminator to eh-frame sections on ELF/x86-64.
__register_ehframes on Linux requires a null terminator to identify the end of
this section.
Added:
Modified:
llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h
llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
Removed:
################################################################################
diff --git a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
index 3602601287f4..93123ca743e9 100644
--- a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupport.cpp
@@ -730,6 +730,29 @@ Expected<Symbol &> EHFrameEdgeFixer::getOrCreateSymbol(ParseContext &PC,
return PC.G.addAnonymousSymbol(*B, Addr - B->getAddress(), 0, false, false);
}
+char EHFrameNullTerminator::NullTerminatorBlockContent[] = {0, 0, 0, 0};
+
+EHFrameNullTerminator::EHFrameNullTerminator(StringRef EHFrameSectionName)
+ : EHFrameSectionName(EHFrameSectionName) {}
+
+Error EHFrameNullTerminator::operator()(LinkGraph &G) {
+ auto *EHFrame = G.findSectionByName(EHFrameSectionName);
+
+ if (!EHFrame)
+ return Error::success();
+
+ LLVM_DEBUG({
+ dbgs() << "EHFrameNullTerminator adding null terminator to "
+ << EHFrameSectionName << "\n";
+ });
+
+ auto &NullTerminatorBlock =
+ G.createContentBlock(*EHFrame, StringRef(NullTerminatorBlockContent, 4),
+ 0xfffffffffffffffc, 1, 0);
+ G.addAnonymousSymbol(NullTerminatorBlock, 0, 4, false, true);
+ return Error::success();
+}
+
EHFrameRegistrar::~EHFrameRegistrar() {}
Error InProcessEHFrameRegistrar::registerEHFrames(
diff --git a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h
index 5e68e72ba18d..b4c4b0f7b097 100644
--- a/llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h
+++ b/llvm/lib/ExecutionEngine/JITLink/EHFrameSupportImpl.h
@@ -116,6 +116,17 @@ class EHFrameEdgeFixer {
Edge::Kind NegDelta32;
};
+/// Add a 32-bit null-terminator to the end of the eh-frame section.
+class EHFrameNullTerminator {
+public:
+ EHFrameNullTerminator(StringRef EHFrameSectionName);
+ Error operator()(LinkGraph &G);
+
+private:
+ static char NullTerminatorBlockContent[];
+ StringRef EHFrameSectionName;
+};
+
} // end namespace jitlink
} // end namespace llvm
diff --git a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
index f81e67421c1b..e43e9608c69a 100644
--- a/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
+++ b/llvm/lib/ExecutionEngine/JITLink/ELF_x86_64.cpp
@@ -768,6 +768,7 @@ void link_ELF_x86_64(std::unique_ptr<LinkGraph> G,
Config.PrePrunePasses.push_back(EHFrameSplitter(".eh_frame"));
Config.PrePrunePasses.push_back(EHFrameEdgeFixer(
".eh_frame", G->getPointerSize(), Delta64, Delta32, NegDelta32));
+ Config.PrePrunePasses.push_back(EHFrameNullTerminator(".eh_frame"));
// Construct a JITLinker and run the link function.
// Add a mark-live pass.
More information about the llvm-commits
mailing list