mirror of
https://github.com/intel/llvm.git
synced 2026-01-16 21:55:39 +08:00
[ELF] Add support for PT_OPENBSD_NOBTCFI (#120005)
This commit is contained in:
@@ -363,6 +363,7 @@ struct Config {
|
||||
bool zInterpose;
|
||||
bool zKeepTextSectionPrefix;
|
||||
bool zLrodataAfterBss;
|
||||
bool zNoBtCfi = false;
|
||||
bool zNodefaultlib;
|
||||
bool zNodelete;
|
||||
bool zNodlopen;
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
Reference in New Issue
Block a user