Mark Kettenis:

> CVSROOT:      /cvs
> Module name:  src
> Changes by:   kette...@cvs.openbsd.org        2023/04/19 10:04:33
> 
> Modified files:
>       gnu/llvm/lld/ELF: Config.h Driver.cpp Writer.cpp 
>       gnu/llvm/llvm/include/llvm/BinaryFormat: ELF.h 
>       gnu/llvm/llvm/tools/llvm-objdump: ELFDump.cpp 
>       gnu/llvm/llvm/tools/llvm-readobj: ELFDumper.cpp 
> 
> Log message:
> Implement support for PT_OPENBSD_NOBTCFI in lld(1).  This can be set using
> the -z nobtcfi option.

This also needs a tweak to apply to LLVM 15:

-----------------------------------------------
commit 072b0a41d978c446342c34a7a901579f460f80d2 (llvm15)
from: Christian Weisgerber <na...@mips.inka.de>
date: Fri Apr 21 21:25:24 2023 UTC
 
 Implement support for PT_OPENBSD_NOBTCFI in lld(1).  This can be set using
 the -z nobtcfi option.
 
 ok deraadt@
 
diff 0822bbb9df762f4498888d710cd2fa18c491bc31 
072b0a41d978c446342c34a7a901579f460f80d2
commit - 0822bbb9df762f4498888d710cd2fa18c491bc31
commit + 072b0a41d978c446342c34a7a901579f460f80d2
blob - 7e6da4dfb40ed4c6208bef8d3305ba712d55b899
blob + 642773d87ab4eecf109bbcbc4233f9e72430c98d
--- gnu/llvm/lld/ELF/Config.h
+++ gnu/llvm/lld/ELF/Config.h
@@ -250,6 +250,7 @@ struct Configuration {
   bool zInitfirst;
   bool zInterpose;
   bool zKeepTextSectionPrefix;
+  bool zNoBtCfi;
   bool zNodefaultlib;
   bool zNodelete;
   bool zNodlopen;
blob - c6a9a53a8d9c9938e2c389249d78bbddc3829429
blob + 1b5e617d1f3a9f8e36c612a63d655f8975ace70b
--- gnu/llvm/lld/ELF/Driver.cpp
+++ gnu/llvm/lld/ELF/Driver.cpp
@@ -473,6 +473,7 @@ constexpr const char *knownZFlags[] = {
     "keep-text-section-prefix",
     "lazy",
     "muldefs",
+    "nobtcfi",
     "nocombreloc",
     "nocopyreloc",
     "nodefaultlib",
@@ -1258,6 +1259,7 @@ static void readConfigs(opt::InputArgList &args) {
   config->zInterpose = hasZOption(args, "interpose");
   config->zKeepTextSectionPrefix = getZFlag(
       args, "keep-text-section-prefix", "nokeep-text-section-prefix", false);
+  config->zNoBtCfi = hasZOption(args, "nobtcfi");
   config->zNodefaultlib = hasZOption(args, "nodefaultlib");
   config->zNodelete = hasZOption(args, "nodelete");
   config->zNodlopen = hasZOption(args, "nodlopen");
blob - cd237088be76ab4780cf74acb7123be883308fba
blob + 52f65f260c4cf72a7e6a4b43c8a6c52bc50ca30f
--- gnu/llvm/lld/ELF/Writer.cpp
+++ gnu/llvm/lld/ELF/Writer.cpp
@@ -2438,6 +2438,11 @@ SmallVector<PhdrEntry *, 0> Writer<ELFT>::createPhdrs(
   if (config->zWxneeded)
     addHdr(PT_OPENBSD_WXNEEDED, PF_X);
 
+  // PT_OPENBSD_NOBTCFI is an OpenBSD-specific header to mark that the
+  // executable is expected to violate branch-target CFI checks.
+  if (config->zNoBtCfi)
+    addHdr(PT_OPENBSD_NOBTCFI, PF_X);
+
   if (OutputSection *cmd = findSection(".note.gnu.property", partNo))
     addHdr(PT_GNU_PROPERTY, PF_R)->add(cmd);
 
blob - ad0612dcc2747fb88e4d05213e1d9b1931cee2ea
blob + eedb59c4925aaeb97e6e1474fb455124bd24fda8
--- gnu/llvm/llvm/include/llvm/BinaryFormat/ELF.h
+++ gnu/llvm/llvm/include/llvm/BinaryFormat/ELF.h
@@ -1380,6 +1380,7 @@ enum {
   PT_OPENBSD_MUTABLE = 0x65a3dbe5,   // Like bss, but not immutable.
   PT_OPENBSD_RANDOMIZE = 0x65a3dbe6, // Fill with random data.
   PT_OPENBSD_WXNEEDED = 0x65a3dbe7,  // Program does W^X violations.
+  PT_OPENBSD_NOBTCFI = 0x65a3dbe8,   // Do not enforce branch target CFI
   PT_OPENBSD_BOOTDATA = 0x65a41be6,  // Section for boot arguments.
 
   // ARM program header types.
blob - b98b45e3015a11ecc51a0d99f6e8ac75fb8ede35
blob + a07e29874f9445d2369ffd6560f711b62470ba81
--- gnu/llvm/llvm/tools/llvm-objdump/ELFDump.cpp
+++ gnu/llvm/llvm/tools/llvm-objdump/ELFDump.cpp
@@ -253,6 +253,9 @@ static void printProgramHeaders(const ELFFile<ELFT> &O
     case ELF::PT_OPENBSD_MUTABLE:
       outs() << "OPENBSD_MUTABLE ";
       break;
+    case ELF::PT_OPENBSD_NOBTCFI:
+      outs() << "OPENBSD_NOBTCFI ";
+      break;
     case ELF::PT_OPENBSD_RANDOMIZE:
       outs() << "OPENBSD_RANDOMIZE ";
       break;
blob - 5f84e6bf2d9219f7792a67c59453349ce77b43c3
blob + bfc42b42eafdc2c629b0a173393a3b6c69ad6486
--- gnu/llvm/llvm/tools/llvm-readobj/ELFDumper.cpp
+++ gnu/llvm/llvm/tools/llvm-readobj/ELFDumper.cpp
@@ -1414,6 +1414,7 @@ static StringRef segmentTypeToString(unsigned Arch, un
     LLVM_READOBJ_ENUM_CASE(ELF, PT_OPENBSD_MUTABLE);
     LLVM_READOBJ_ENUM_CASE(ELF, PT_OPENBSD_RANDOMIZE);
     LLVM_READOBJ_ENUM_CASE(ELF, PT_OPENBSD_WXNEEDED);
+    LLVM_READOBJ_ENUM_CASE(ELF, PT_OPENBSD_NOBTCFI);
     LLVM_READOBJ_ENUM_CASE(ELF, PT_OPENBSD_BOOTDATA);
   default:
     return "";

-- 
Christian "naddy" Weisgerber                          na...@mips.inka.de

Reply via email to