2020-07-26 15:03:06 -07:00
|
|
|
OUTPUT_FORMAT("elf%BITS%-littleriscv")
|
2020-05-15 01:32:18 -07:00
|
|
|
/*
|
2020-07-11 15:33:14 -07:00
|
|
|
* LK linker script for single segment binaries.
|
2020-05-15 01:32:18 -07:00
|
|
|
*/
|
|
|
|
|
PHDRS
|
|
|
|
|
{
|
|
|
|
|
code PT_LOAD FLAGS(5); /* PF_R|PF_X */
|
|
|
|
|
rodata PT_LOAD FLAGS(4); /* PF_R */
|
|
|
|
|
data PT_LOAD FLAGS(6); /* PF_R|PF_W */
|
|
|
|
|
}
|
2018-10-14 17:12:01 -07:00
|
|
|
|
|
|
|
|
ENTRY(_start)
|
|
|
|
|
SECTIONS
|
|
|
|
|
{
|
2019-03-30 21:31:47 -07:00
|
|
|
. = %KERNEL_BASE% + %KERNEL_LOAD_OFFSET%;
|
|
|
|
|
|
|
|
|
|
_start = .;
|
2020-07-11 15:33:14 -07:00
|
|
|
__rom_start = .;
|
2018-10-14 17:12:01 -07:00
|
|
|
|
|
|
|
|
/* text/read-only data */
|
|
|
|
|
/* set the load address to physical MEMBASE */
|
2019-03-30 21:31:47 -07:00
|
|
|
.text : AT(%MEMBASE% + %KERNEL_LOAD_OFFSET%) {
|
2018-10-14 17:12:01 -07:00
|
|
|
KEEP(*(.text.boot))
|
|
|
|
|
*(.text .text*)
|
|
|
|
|
*(.gnu.linkonce.t.*)
|
2020-05-15 01:32:18 -07:00
|
|
|
} :code
|
2018-10-14 17:12:01 -07:00
|
|
|
|
2020-07-11 15:33:14 -07:00
|
|
|
. = ALIGN(CONSTANT(MAXPAGESIZE));
|
|
|
|
|
|
|
|
|
|
.rodata : {
|
2019-03-30 21:31:47 -07:00
|
|
|
__rodata_start = .;
|
2018-10-14 17:12:01 -07:00
|
|
|
*(.rodata .rodata.* .gnu.linkonce.r.*)
|
2020-05-15 01:32:18 -07:00
|
|
|
} :rodata
|
2018-10-14 17:12:01 -07:00
|
|
|
|
2020-12-09 01:59:16 -08:00
|
|
|
/* trick to force any extra sections to be emitted here */
|
2020-07-11 15:33:14 -07:00
|
|
|
. = .;
|
2020-12-09 01:59:16 -08:00
|
|
|
|
2020-07-11 15:33:14 -07:00
|
|
|
__rodata_end = .;
|
|
|
|
|
__rom_end = . ;
|
|
|
|
|
. = ALIGN(CONSTANT(MAXPAGESIZE));
|
|
|
|
|
__data_start_rom = .;
|
2018-10-14 17:12:01 -07:00
|
|
|
|
2020-07-11 15:33:14 -07:00
|
|
|
.data : {
|
2018-10-14 17:12:01 -07:00
|
|
|
__data_start = .;
|
|
|
|
|
*(.data .data.* .gnu.linkonce.d.*)
|
|
|
|
|
__ctor_list = .;
|
2025-09-26 20:17:15 +08:00
|
|
|
KEEP(*(.ctors .init_array*))
|
2018-10-14 17:12:01 -07:00
|
|
|
__ctor_end = .;
|
|
|
|
|
__dtor_list = .;
|
2025-09-26 20:17:15 +08:00
|
|
|
KEEP(*(.dtors .fini_array*))
|
2018-10-14 17:12:01 -07:00
|
|
|
__dtor_end = .;
|
|
|
|
|
*(.got*)
|
|
|
|
|
*(.dynamic)
|
2020-05-15 01:32:18 -07:00
|
|
|
} :data
|
2018-10-14 17:12:01 -07:00
|
|
|
|
2020-07-11 15:33:14 -07:00
|
|
|
/* Try to put sdata and sbss near each other by putting sdata at the end of the data segment
|
|
|
|
|
* and sbss at the start of the bss segment. This maximizes reach of things referenced off of
|
|
|
|
|
* the global pointer. */
|
|
|
|
|
.sdata : {
|
|
|
|
|
__global_pointer$ = . + (4K / 2);
|
|
|
|
|
*(.srodata.cst16) *(.srodata.cst8) *(.srodata.cst4) *(.srodata.cst2) *(.srodata .srodata.*)
|
|
|
|
|
*(.sdata .sdata.* .gnu.linkonce.s.*)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
. = ALIGN(%BITS% / 8);
|
|
|
|
|
__data_end = .;
|
|
|
|
|
__bss_start = .;
|
|
|
|
|
|
|
|
|
|
.sbss : {
|
|
|
|
|
*(.dynsbss)
|
|
|
|
|
*(.sbss .sbss.* .gnu.linkonce.sb.*)
|
|
|
|
|
*(.scommon)
|
2018-10-14 17:12:01 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/* uninitialized data (in same segment as writable data) */
|
2020-07-11 15:33:14 -07:00
|
|
|
.bss : {
|
2018-10-14 17:12:01 -07:00
|
|
|
/* regular bss */
|
|
|
|
|
*(.bss .bss.*)
|
|
|
|
|
*(.gnu.linkonce.b.*)
|
|
|
|
|
}
|
|
|
|
|
|
2020-07-11 15:33:14 -07:00
|
|
|
. = ALIGN(%BITS% / 8);
|
|
|
|
|
__bss_end = .;
|
|
|
|
|
|
2019-12-04 09:08:57 -08:00
|
|
|
/* Align the end to ensure anything after the kernel ends up on its own pages */
|
2020-05-15 01:32:18 -07:00
|
|
|
. = ALIGN(CONSTANT(MAXPAGESIZE));
|
2018-10-14 17:12:01 -07:00
|
|
|
_end = .;
|
|
|
|
|
|
2019-03-30 21:31:47 -07:00
|
|
|
. = %KERNEL_BASE% + %MEMSIZE%;
|
2018-10-14 17:12:01 -07:00
|
|
|
_end_of_ram = .;
|
|
|
|
|
|
|
|
|
|
/* Strip unnecessary stuff */
|
|
|
|
|
/DISCARD/ : { *(.comment .note .eh_frame) }
|
|
|
|
|
}
|
|
|
|
|
|