|
@@ -0,0 +1,79 @@
|
|
|
+/* Simple linker script for the ROS kernel.
|
|
|
+ See the GNU ld 'info' manual ("info ld") to learn the syntax. */
|
|
|
+
|
|
|
+/* This script needs to be invoked with -z max-page-size=0x1000. Otherwise,
|
|
|
+ * ld will offset our first section to 1MB within the actual file. Multiboot
|
|
|
+ * requires the header to be in the first two pages. */
|
|
|
+
|
|
|
+OUTPUT_ARCH("riscv")
|
|
|
+/*OUTPUT_FORMAT("elf64-littleriscv", "elf64-x86-64", "elf64-x86-64") */
|
|
|
+ENTRY(_start)
|
|
|
+/* start the kernel at 0x110000.
|
|
|
+ * That way we can use lower ram for critical structures
|
|
|
+ */
|
|
|
+KERN_LOAD_ADDR = 0xffffffff80000000;
|
|
|
+
|
|
|
+SECTIONS
|
|
|
+{
|
|
|
+ /* Entry Linked and loaded at 0x00100000 (includes multiboot) */
|
|
|
+ . = 0x00110000;
|
|
|
+
|
|
|
+ .bootstrap : {
|
|
|
+ *(.boottext .bootdata)
|
|
|
+ }
|
|
|
+
|
|
|
+ /* Link the main kernel for the space after entry + KERN_LOAD_ADDR. We'll
|
|
|
+ * still load it adjacent in physical memory */
|
|
|
+ . += KERN_LOAD_ADDR;
|
|
|
+
|
|
|
+ .text : AT(ADDR(.text) - KERN_LOAD_ADDR) {
|
|
|
+ *(.text .stub .text.* .gnu.linkonce.t.*)
|
|
|
+ }
|
|
|
+
|
|
|
+ PROVIDE(etext = .); /* Define the 'etext' symbol to this value */
|
|
|
+
|
|
|
+ /* Linker-made tables. Our tables (e.g. devtab) are 2^6 aligned,
|
|
|
+ * independently of us aligning '.'. We align '.' to get the right start,
|
|
|
+ * e.g. __devtabstart. */
|
|
|
+ . = ALIGN(64);
|
|
|
+ /* We shouldn't have to use PROVIDE, but if we don't, we get the wrong
|
|
|
+ * value for '.'. And items with empty tables get the KLA (basically 0) */
|
|
|
+ PROVIDE(__devtabstart = .);
|
|
|
+ PROVIDE(devtab = .);
|
|
|
+ .devtab : {
|
|
|
+ *(.devtab)
|
|
|
+ }
|
|
|
+ PROVIDE(__devtabend = .);
|
|
|
+
|
|
|
+ .rodata : {
|
|
|
+ *(.rodata .rodata.* .gnu.linkonce.r.*)
|
|
|
+ }
|
|
|
+
|
|
|
+ /* TODO: add some debug info. i hear stabs are 32 bit only, so we'll need
|
|
|
+ * to bring in some dwarves. for now, hack in the symbols to compile. */
|
|
|
+ PROVIDE(__STAB_BEGIN__ = .);
|
|
|
+ PROVIDE(__STAB_END__ = .);
|
|
|
+ PROVIDE(__STABSTR_BEGIN__ = .);
|
|
|
+ PROVIDE(__STABSTR_END__ = .);
|
|
|
+
|
|
|
+ /* Adjust the address for the data segment to the next page */
|
|
|
+ . = ALIGN(0x1000);
|
|
|
+
|
|
|
+ /* The data segment */
|
|
|
+ .data : {
|
|
|
+ *(.data)
|
|
|
+ }
|
|
|
+
|
|
|
+ PROVIDE(edata = .);
|
|
|
+
|
|
|
+ .bss : {
|
|
|
+ *(.bss)
|
|
|
+ *(COMMON)
|
|
|
+ }
|
|
|
+
|
|
|
+ PROVIDE(end = .);
|
|
|
+
|
|
|
+ /DISCARD/ : {
|
|
|
+ *(.eh_frame .note.GNU-stack)
|
|
|
+ }
|
|
|
+}
|