Index: lld/ELF/Arch/AArch64.cpp
--- lld/ELF/Arch/AArch64.cpp.orig
+++ lld/ELF/Arch/AArch64.cpp
@@ -836,7 +836,11 @@ class AArch64BtiPac final : public AArch64 { (private)
 } // namespace
 
 AArch64BtiPac::AArch64BtiPac() {
+#ifdef __OpenBSD__
+  btiHeader = true;
+#else
   btiHeader = (config->andFeatures & GNU_PROPERTY_AARCH64_FEATURE_1_BTI);
+#endif
   // A BTI (Branch Target Indicator) Plt Entry is only required if the
   // address of the PLT entry can be taken by the program, which permits an
   // indirect jump to the PLT entry. This can happen when the address
@@ -912,7 +916,8 @@ void AArch64BtiPac::writePlt(uint8_t *buf, const Symbo
   // 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);
@@ -936,6 +941,10 @@ void AArch64BtiPac::writePlt(uint8_t *buf, const Symbo
 }
 
 static TargetInfo *getTargetInfo() {
+#ifdef __OpenBSD__
+  static AArch64BtiPac t;
+  return &t;
+#else
   if ((config->andFeatures & GNU_PROPERTY_AARCH64_FEATURE_1_BTI) ||
       config->zPacPlt) {
     static AArch64BtiPac t;
@@ -943,6 +952,7 @@ static TargetInfo *getTargetInfo() {
   }
   static AArch64 t;
   return &t;
+#endif
 }
 
 TargetInfo *elf::getAArch64TargetInfo() { return getTargetInfo(); }
