On OpenBSD we always want IBT-compatible PLT entries. Currently we use
authorkettenis <kettenis@openbsd.org>
Sat, 3 Feb 2024 11:03:48 +0000 (11:03 +0000)
committerkettenis <kettenis@openbsd.org>
Sat, 3 Feb 2024 11:03:48 +0000 (11:03 +0000)
repoline PLT entries that were changed to include the necessary endbr64
instructions.  But with -Wl,-znoretpolineplt we would still emit non-BIT
PLT entries under certain circumstances.  Fix this.

ok deraadt@, guenther@

gnu/llvm/lld/ELF/Arch/X86_64.cpp
gnu/llvm/lld/ELF/SyntheticSections.cpp
gnu/llvm/lld/ELF/Writer.cpp

index a44c2fe..a74bf88 100644 (file)
@@ -1186,6 +1186,10 @@ static TargetInfo *getTargetInfo() {
     return &t;
   }
 
+#ifdef __OpenBSD__
+  static IntelIBT t;
+  return &t;
+#else
   if (config->andFeatures & GNU_PROPERTY_X86_FEATURE_1_IBT) {
     static IntelIBT t;
     return &t;
@@ -1193,6 +1197,7 @@ static TargetInfo *getTargetInfo() {
 
   static X86_64 t;
   return &t;
+#endif
 }
 
 TargetInfo *elf::getX86_64TargetInfo() { return getTargetInfo(); }
index e7c437b..b73b326 100644 (file)
@@ -2500,6 +2500,10 @@ PltSection::PltSection()
   if ((config->emachine == EM_386 || config->emachine == EM_X86_64) &&
       (config->andFeatures & GNU_PROPERTY_X86_FEATURE_1_IBT))
     name = ".plt.sec";
+#ifdef __OpenBSD__
+  else if (config->emachine == EM_X86_64)
+    name = ".plt.sec";
+#endif
 
   // The PLT needs to be writable on SPARC as the dynamic linker will
   // modify the instructions in the PLT entries.
index 3bba1b6..eb4643d 100644 (file)
@@ -489,6 +489,12 @@ template <class ELFT> void elf::createSyntheticSections() {
     in.ibtPlt = std::make_unique<IBTPltSection>();
     add(*in.ibtPlt);
   }
+#ifdef __OpenBSD__
+  else if (config->emachine == EM_X86_64) {
+    in.ibtPlt = std::make_unique<IBTPltSection>();
+    add(*in.ibtPlt);
+  }
+#endif
 
   if (config->emachine == EM_PPC)
     in.plt = std::make_unique<PPC32GlinkSection>();