OUTPUT_ARCH(riscv) ENTRY(_start) KERNEL_PHYS_BASE = 0x80200000; KERNEL_VIRT_OFFSET = 0xffffffc000000000; BOOT_STACK_SIZE = 0x10000; KERNEL_STACK_SIZE = 0x10000; SECTIONS { . = KERNEL_PHYS_BASE; __boot_phys_start = .; .boot.text : ALIGN(0x1000) { *(.boot.text) *(.boot.text.*) } .boot.rodata : ALIGN(0x1000) { *(.boot.rodata) *(.boot.rodata.*) } .boot.data : ALIGN(0x1000) { *(.boot.data) *(.boot.data.*) } .boot.bss (NOLOAD) : ALIGN(0x1000) { *(.boot.bss) *(.boot.bss.*) } . = ALIGN(16); . += BOOT_STACK_SIZE; __boot_stack_top = .; . = ALIGN(0x1000); __boot_phys_end = .; __kernel_phys_start = .; . = KERNEL_VIRT_OFFSET + __kernel_phys_start; __kernel_start = .; __kernel_virt_start = .; .text : AT(ADDR(.text) - KERNEL_VIRT_OFFSET) ALIGN(0x1000) { *(.text) *(.text.*) } .rodata : AT(ADDR(.rodata) - KERNEL_VIRT_OFFSET) ALIGN(0x1000) { *(.rodata) *(.rodata.*) } .data : AT(ADDR(.data) - KERNEL_VIRT_OFFSET) ALIGN(0x1000) { PROVIDE(__global_pointer$ = . + 0x800); *(.data) *(.data.*) *(.sdata) *(.sdata.*) } .bss : AT(ADDR(.bss) - KERNEL_VIRT_OFFSET) ALIGN(0x1000) { __bss_start = .; *(.bss) *(.bss.*) *(.sbss) *(.sbss.*) *(COMMON) . = ALIGN(16); . += KERNEL_STACK_SIZE; __stack_top = .; __bss_end = .; } __kernel_end = ALIGN(., 0x1000); __kernel_virt_end = __kernel_end; __kernel_phys_end = __kernel_end - KERNEL_VIRT_OFFSET; __memory_start = __kernel_phys_end; /DISCARD/ : { *(.eh_frame) *(.eh_frame_hdr) } }