From 3dcb696de13080c602956e6bdd05853e4c57b8b2 Mon Sep 17 00:00:00 2001 From: Alex Date: Tue, 9 May 2023 01:06:30 +0300 Subject: [PATCH] Update linker for i386 --- Architecture/i386/linker.ld | 65 +++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/Architecture/i386/linker.ld b/Architecture/i386/linker.ld index 165ea54a..4913e603 100644 --- a/Architecture/i386/linker.ld +++ b/Architecture/i386/linker.ld @@ -20,55 +20,80 @@ OUTPUT_ARCH(i386) ENTRY(_start) +PF_R = 0x4; +PF_W = 0x2; +PF_X = 0x1; + +PHDRS +{ + bootstrap PT_LOAD FLAGS( PF_R | PF_W /*| PF_X*/ ); + text PT_LOAD FLAGS( PF_R | PF_X ); + data PT_LOAD FLAGS( PF_R | PF_W ); + rodata PT_LOAD FLAGS( PF_R ); + bss PT_LOAD FLAGS( PF_R | PF_W ); +} + +KERNEL_VMA = 0xC0000000; + SECTIONS { - . = 0xC0000000; + . = 0x100000; + _bootstrap_start = .; + .bootstrap ALIGN(CONSTANT(MAXPAGESIZE)) : + { + *(.multiboot) + *(.multiboot2) + *(.bootstrap .bootstrap.*) + } :bootstrap + _bootstrap_end = ALIGN(CONSTANT(MAXPAGESIZE)); - _kernel_start = .; - .text : + . += KERNEL_VMA; + + _kernel_start = ALIGN(CONSTANT(MAXPAGESIZE)); + _kernel_text_start = ALIGN(CONSTANT(MAXPAGESIZE)); + .text ALIGN(CONSTANT(MAXPAGESIZE)) : AT(ADDR(.text) - KERNEL_VMA) { *(.text .text.*) - } + } :text _kernel_text_end = ALIGN(CONSTANT(MAXPAGESIZE)); - . += CONSTANT(MAXPAGESIZE); - .data : + _kernel_data_start = ALIGN(CONSTANT(MAXPAGESIZE)); + .data ALIGN(CONSTANT(MAXPAGESIZE)) : AT(ADDR(.data) - KERNEL_VMA) { *(.data .data.*) - } + } :data _kernel_data_end = ALIGN(CONSTANT(MAXPAGESIZE)); - . += CONSTANT(MAXPAGESIZE); - .rodata : + _kernel_rodata_start = ALIGN(CONSTANT(MAXPAGESIZE)); + .rodata ALIGN(CONSTANT(MAXPAGESIZE)) : AT(ADDR(.rodata) - KERNEL_VMA) { *(.rodata .rodata.*) - } - _kernel_rodata_end = ALIGN(CONSTANT(MAXPAGESIZE)); - . += CONSTANT(MAXPAGESIZE); + } :rodata - .init_array : + .init_array ALIGN(CONSTANT(MAXPAGESIZE)) : AT(ADDR(.init_array) - KERNEL_VMA) { PROVIDE_HIDDEN(__init_array_start = .); KEEP(*(.init_array .ctors)) KEEP(*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) PROVIDE_HIDDEN (__init_array_end = .); - } + } :rodata - .fini_array : + .fini_array ALIGN(CONSTANT(MAXPAGESIZE)) : AT(ADDR(.fini_array) - KERNEL_VMA) { PROVIDE_HIDDEN(__fini_array_start = .); KEEP(*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) KEEP(*(.fini_array .dtors)) PROVIDE_HIDDEN (__fini_array_end = .); - } - . += CONSTANT(MAXPAGESIZE); + } :rodata + _kernel_rodata_end = ALIGN(CONSTANT(MAXPAGESIZE)); - .bss : + _kernel_bss_start = ALIGN(CONSTANT(MAXPAGESIZE)); + .bss ALIGN(CONSTANT(MAXPAGESIZE)) : AT(ADDR(.bss) - KERNEL_VMA) { *(COMMON) *(.bss .bss.*) - } - . += CONSTANT(MAXPAGESIZE); + } :bss + _kernel_bss_end = ALIGN(CONSTANT(MAXPAGESIZE)); _kernel_end = ALIGN(CONSTANT(MAXPAGESIZE)); /DISCARD/ :