Since the introduction of automatic immutable from the kernel, the munmap()
authorderaadt <deraadt@openbsd.org>
Mon, 7 Nov 2022 20:41:38 +0000 (20:41 +0000)
committerderaadt <deraadt@openbsd.org>
Mon, 7 Nov 2022 20:41:38 +0000 (20:41 +0000)
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.
Similar changes for other architectures coming after more testing.
ok kettenis and guenther seemed to like it also

libexec/ld.so/aarch64/ld.script
libexec/ld.so/amd64/ld.script

index d023125..3c4434b 100644 (file)
@@ -2,6 +2,7 @@ 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;
@@ -22,13 +23,14 @@ SECTIONS
     /* TEXT */
     . = ALIGN(0x10000);
     .text      : { *(.text .text.*) } :text
-    . = ALIGN(0x1000);
     .boot.text :
     {
+       . = ALIGN(0x1000);
        boot_text_start = .;
        *(.boot.text)
+       . = ALIGN(0x1000);
        boot_text_end = .;
-    } :text
+    } :btext
 
     /* RELRO DATA */
     . = DATA_SEGMENT_ALIGN (0x10000, 0x1000);
index 5629239..29f4e14 100644 (file)
@@ -2,6 +2,7 @@ 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;
@@ -20,14 +21,15 @@ SECTIONS
     .eh_frame  : { *(.eh_frame) } :rodata
 
     /* TEXT */
-    . = ALIGN(0x100000) + (. & (0x100000 - 1)) +   0;
+    . = ALIGN(0x1000);
     .boot.text :
     {
+       . = ALIGN(0x1000);
        boot_text_start = .;
        *(.boot.text)
+       . = ALIGN(0x1000);
        boot_text_end = .;
-    } :text =0xcccccccc
-    . = ALIGN(0x1000);
+    } :btext =0xcccccccc
     .text      : { *(.text .text.*) } :text =0xcccccccc
 
     /* RELRO DATA */