[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