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