This moves linker related tables from .data to read-only area.
Relocations are performed at early boot time before memory is protected,
after which there should be no modifications required.

Signed-off-by: Nicholas Piggin <npig...@gmail.com>
---
 arch/powerpc/kernel/vmlinux.lds.S | 42 ++++++++++++++++++++-----------
 1 file changed, 27 insertions(+), 15 deletions(-)

diff --git a/arch/powerpc/kernel/vmlinux.lds.S 
b/arch/powerpc/kernel/vmlinux.lds.S
index 341ac79f49a9..716fff86c3fd 100644
--- a/arch/powerpc/kernel/vmlinux.lds.S
+++ b/arch/powerpc/kernel/vmlinux.lds.S
@@ -131,6 +131,10 @@ SECTIONS
        /* Read-only data */
        RO_DATA(PAGE_SIZE)
 
+       .branch_lt : AT(ADDR(.branch_lt) - LOAD_OFFSET) {
+               *(.branch_lt)
+       }
+
 #ifdef CONFIG_PPC32
        .got1 : AT(ADDR(.got1) - LOAD_OFFSET) {
                *(.got1)
@@ -140,7 +144,30 @@ SECTIONS
                *(.got2)
                __got2_end = .;
        }
+       .got : AT(ADDR(.got) - LOAD_OFFSET) SPECIAL {
+               *(.got)
+               *(.got.plt)
+       }
+       .plt : AT(ADDR(.plt) - LOAD_OFFSET) SPECIAL {
+               /* XXX: is .plt (and .got.plt) required? */
+               *(.plt)
+       }
+
 #else /* CONFIG_PPC32 */
+       .toc1 : AT(ADDR(.toc1) - LOAD_OFFSET) {
+               *(.toc1)
+       }
+
+       .got : AT(ADDR(.got) - LOAD_OFFSET) ALIGN(256) {
+               *(.got)
+#ifndef CONFIG_RELOCATABLE
+               __prom_init_toc_start = .;
+               arch/powerpc/kernel/prom_init.o*(.toc)
+               __prom_init_toc_end = .;
+#endif
+               *(.toc)
+       }
+
        SOFT_MASK_TABLE(8)
        RESTART_TABLE(8)
 
@@ -327,26 +354,11 @@ SECTIONS
                *(.data.rel*)
                *(SDATA_MAIN)
                *(.sdata2)
-               *(.got.plt) *(.got)
-               *(.plt)
-               *(.branch_lt)
        }
 #else
        .data : AT(ADDR(.data) - LOAD_OFFSET) {
                DATA_DATA
                *(.data.rel*)
-               *(.toc1)
-               *(.branch_lt)
-       }
-
-       .got : AT(ADDR(.got) - LOAD_OFFSET) ALIGN(256) {
-               *(.got)
-#ifndef CONFIG_RELOCATABLE
-               __prom_init_toc_start = .;
-               arch/powerpc/kernel/prom_init.o*(.toc)
-               __prom_init_toc_end = .;
-#endif
-               *(.toc)
        }
 #endif
 
-- 
2.37.2

Reply via email to