[ELF] Add support for PT_OPENBSD_NOBTCFI (#120005)

This commit is contained in:
Brad Smith
2024-12-19 19:41:42 -05:00
committed by GitHub
parent c2aee50620
commit 52574b5f40
5 changed files with 22 additions and 2 deletions

View File

@@ -363,6 +363,7 @@ struct Config {
bool zInterpose;
bool zKeepTextSectionPrefix;
bool zLrodataAfterBss;
bool zNoBtCfi = false;
bool zNodefaultlib;
bool zNodelete;
bool zNodlopen;

View File

@@ -1897,6 +1897,9 @@ static void setConfigs(Ctx &ctx, opt::InputArgList &args) {
ErrAlways(ctx) << "cannot open --why-extract= file " << ctx.arg.whyExtract
<< ": " << e.message();
}
if (ctx.arg.osabi == ELFOSABI_OPENBSD)
ctx.arg.zNoBtCfi = hasZOption(args, "nobtcfi");
}
static bool isFormatBinary(Ctx &ctx, StringRef s) {

View File

@@ -2405,6 +2405,11 @@ Writer<ELFT>::createPhdrs(Partition &part) {
addHdr(PT_GNU_STACK, perm)->p_memsz = ctx.arg.zStackSize;
}
// PT_OPENBSD_NOBTCFI is an OpenBSD-specific header to mark that the
// executable is expected to violate branch-target CFI checks.
if (ctx.arg.zNoBtCfi)
addHdr(PT_OPENBSD_NOBTCFI, PF_X);
// PT_OPENBSD_WXNEEDED is a OpenBSD-specific header to mark the executable
// is expected to perform W^X violations, such as calling mprotect(2) or
// mmap(2) with PROT_WRITE | PROT_EXEC, which is prohibited by default on

View File

@@ -952,6 +952,11 @@ Let __start_/__stop_ references retain the associated C identifier name sections
Do not allow relocations against read-only segments.
This is the default.
.Pp
.It Cm nobtcfi
Create a
.Dv PT_OPENBSD_NOBTCFI
segment.
.Pp
.It Cm wxneeded
Create a
.Dv PT_OPENBSD_WXNEEDED

View File

@@ -4,8 +4,11 @@
# RUN: ld.lld randomdata.o -o randomdata
# RUN: llvm-readelf -S -l randomdata | FileCheck %s --check-prefix=RANDOMDATA
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-openbsd /dev/null -o wxneeded.o
# RUN: ld.lld -z wxneeded wxneeded.o -o wxneeded
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-openbsd /dev/null -o empty.o
# RUN: ld.lld -z nobtcfi empty.o -o nobtcfi
# RUN: llvm-readelf -l nobtcfi | FileCheck %s --check-prefix=NOBTCFI
# RUN: ld.lld -z wxneeded empty.o -o wxneeded
# RUN: llvm-readelf -l wxneeded | FileCheck %s --check-prefix=WXNEEDED
# RUN: ld.lld -T lds randomdata.o -o out
@@ -14,6 +17,9 @@
# RANDOMDATA: Name Type Address Off Size ES Flg Lk Inf Al
# RANDOMDATA: .openbsd.randomdata PROGBITS [[ADDR:[0-9a-f]+]] [[O:[0-9a-f]+]] 000008 00 A 0 0 1
# NOBTCFI: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
# NOBTCFI: OPENBSD_NOBTCFI 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 E 0
# WXNEEDED: Type Offset VirtAddr PhysAddr FileSiz MemSiz Flg Align
# WXNEEDED: OPENBSD_WXNEEDED 0x000000 0x0000000000000000 0x0000000000000000 0x000000 0x000000 E 0