Add arm64 bti pads for range extension thunks.
authortobhe <tobhe@openbsd.org>
Sun, 26 Nov 2023 22:18:45 +0000 (22:18 +0000)
committertobhe <tobhe@openbsd.org>
Sun, 26 Nov 2023 22:18:45 +0000 (22:18 +0000)
Large arm64 binaries like chromium use range extension thunks
for accessing plt entries. Add bti landing pads for the
additional indirection.

upstream commit: 60827df765156cee6cca3dc5049388dde9dac1c0

ok kettenis@

gnu/llvm/lld/ELF/Arch/AArch64.cpp
gnu/llvm/lld/ELF/Symbols.cpp
gnu/llvm/lld/ELF/Symbols.h
gnu/llvm/lld/ELF/Thunks.cpp

index 1ed1227..dcea062 100644 (file)
@@ -916,7 +916,8 @@ void AArch64BtiPac::writePlt(uint8_t *buf, const Symbol &sym,
   // escape to shared objects. isInIplt indicates a non-preemptible ifunc. Its
   // address may escape if referenced by a direct relocation. The condition is
   // conservative.
-  bool hasBti = btiHeader && (sym.hasFlag(NEEDS_COPY) || sym.isInIplt);
+  bool hasBti = btiHeader &&
+                (sym.hasFlag(NEEDS_COPY) || sym.isInIplt || sym.thunkAccessed);
   if (hasBti) {
     memcpy(buf, btiData, sizeof(btiData));
     buf += sizeof(btiData);
index 96ae7a5..5addbaf 100644 (file)
@@ -25,7 +25,7 @@ using namespace llvm::ELF;
 using namespace lld;
 using namespace lld::elf;
 
-static_assert(sizeof(SymbolUnion) <= 64, "SymbolUnion too large");
+static_assert(sizeof(SymbolUnion) <= 72, "SymbolUnion too large");
 
 template <typename T> struct AssertSymbol {
   static_assert(std::is_trivially_destructible<T>(),
index 19ffc8f..865fba3 100644 (file)
@@ -295,6 +295,9 @@ public:
   // True if defined in a DSO as protected visibility.
   uint8_t dsoProtected : 1;
 
+  // True if targeted by a range extension thunk.
+  uint8_t thunkAccessed : 1;
+
   // Temporary flags used to communicate which symbol entries need PLT and GOT
   // entries during postScanRelocations();
   std::atomic<uint16_t> flags;
index 5964196..bed059b 100644 (file)
@@ -1217,7 +1217,9 @@ bool PPC64LongBranchThunk::isCompatibleWith(const InputSection &isec,
   return rel.type == R_PPC64_REL24 || rel.type == R_PPC64_REL14;
 }
 
-Thunk::Thunk(Symbol &d, int64_t a) : destination(d), addend(a), offset(0) {}
+Thunk::Thunk(Symbol &d, int64_t a) : destination(d), addend(a), offset(0) {
+  destination.thunkAccessed = true;
+}
 
 Thunk::~Thunk() = default;