From fe251f38f10b11dedeb43525126aaf28b2b4d0de Mon Sep 17 00:00:00 2001 From: visa Date: Fri, 25 Nov 2022 14:56:56 +0000 Subject: [PATCH] Add ld.so linker script for mips64 Since the introduction of automatic immutable from the kernel, the munmap() of ld.so boot.text region is now (silently) failing because the region is contained within the text LOAD, which is immutable. So create a new btext LOAD with flags PF_X|PF_R|PF_OPENBSD_MUTABLE, and place all boot.text objects in there. This LOAD must also be page-aligned so it doesn't skip unmapping some of the object region, previously it was hilariously unaligned. OK deraadt@ --- libexec/ld.so/mips64/Makefile.inc | 3 +- libexec/ld.so/mips64/ld.script | 75 +++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 libexec/ld.so/mips64/ld.script diff --git a/libexec/ld.so/mips64/Makefile.inc b/libexec/ld.so/mips64/Makefile.inc index 61bba392f36..f60c19b7a9f 100644 --- a/libexec/ld.so/mips64/Makefile.inc +++ b/libexec/ld.so/mips64/Makefile.inc @@ -1,7 +1,8 @@ -# $OpenBSD: Makefile.inc,v 1.8 2019/11/10 22:18:14 guenther Exp $ +# $OpenBSD: Makefile.inc,v 1.9 2022/11/25 14:56:56 visa Exp $ # no jump tables in _dl_boot_bind() CFLAGS += -fno-jump-tables +LD_SCRIPT = ${.CURDIR}/${MACHINE_CPU}/ld.script CHECK_LDSO=c() { \ ! readelf -Wr $$1 | \ diff --git a/libexec/ld.so/mips64/ld.script b/libexec/ld.so/mips64/ld.script new file mode 100644 index 00000000000..2c141a6c22b --- /dev/null +++ b/libexec/ld.so/mips64/ld.script @@ -0,0 +1,75 @@ +PHDRS +{ + rodata PT_LOAD FILEHDR PHDRS FLAGS (4); + text PT_LOAD; + btext PT_LOAD FLAGS (0x08000005); + data PT_LOAD; + random PT_OPENBSD_RANDOMIZE; + relro PT_GNU_RELRO; + dynamic PT_DYNAMIC; + note PT_NOTE; +} + +SECTIONS +{ + . = 0 + SIZEOF_HEADERS; + /* RODATA */ + .gnu.hash : { *(.gnu.hash) } :rodata + .dynsym : { *(.dynsym) } :rodata + .dynstr : { *(.dynstr) } :rodata + .rodata : { *(.rodata .rodata.*) } :rodata + .eh_frame : { *(.eh_frame) } :rodata + + /* TEXT */ + . = ALIGN(0x4000); + .boot.text : + { + . = ALIGN(0x4000); + boot_text_start = .; + *(.boot.text) + . = ALIGN(0x4000); + boot_text_end = .; + } :btext =0xefefefef + . = ALIGN(0x4000); + .text : { *(.text .text.*) } :text =0xefefefef + + /* RELRO DATA */ + . = DATA_SEGMENT_ALIGN (0x10000, 0x4000); + .openbsd.randomdata : + { + *(.openbsd.randomdata .openbsd.randomdata.*) + } :data :relro :random + .data.rel.ro : { *(.data.rel.ro.local*) *(.data.rel.ro*) } :data :relro + .dynamic : { *(.dynamic) } :data :relro :dynamic + _gp = ALIGN(16) + 0x7ff0; + .got : { *(.got.plt) *(.got) } :data :relro + . = DATA_SEGMENT_RELRO_END (0, .); + + /* BOOTDATA */ + . = ALIGN(0x4000); + boot_data_start = .; + .rela.dyn : + { + *(.rela.text .rela.text.*) + *(.rela.rodata .rela.rodata.*) + *(.rela.data .rela.data.*) + *(.rela.got) + *(.rela.bss .rela.bss.*) + } :data +/* XXX .rela.plt is unused but cannot delete: ld.bfd zeros DT_RELASZ then! */ + .rela.plt : { *(.rela.plt) } :data + .note : { *(.note.openbsd.*) } :data :note + .hash : { *(.hash) } :data + .boot.data : { *(.boot.data .boot.data.*) } :data + boot_data_end = .; + + /* DATA */ + . = ALIGN(0x4000); + .sdata : { *(.sdata .sdata.*) } :data + .data : { *(.data .data.*) } :data + .sbss : { *(.sbss .sbss.*) } :data + .bss : { *(.dynbss) *(.bss .bss.*) *(COMMON) } :data + . = DATA_SEGMENT_END (.); + + /DISCARD/ : { *(.note.GNU-stack) } +} -- 2.20.1