Add ld.so linker script for mips64
authorvisa <visa@openbsd.org>
Fri, 25 Nov 2022 14:56:56 +0000 (14:56 +0000)
committervisa <visa@openbsd.org>
Fri, 25 Nov 2022 14:56:56 +0000 (14:56 +0000)
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
libexec/ld.so/mips64/ld.script [new file with mode: 0644]

index 61bba39..f60c19b 100644 (file)
@@ -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 (file)
index 0000000..2c141a6
--- /dev/null
@@ -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) }
+}