aboutsummaryrefslogtreecommitdiffstats
path: root/src/arch/riscv/scripts/sbi.lds
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/riscv/scripts/sbi.lds')
-rw-r--r--src/arch/riscv/scripts/sbi.lds119
1 files changed, 119 insertions, 0 deletions
diff --git a/src/arch/riscv/scripts/sbi.lds b/src/arch/riscv/scripts/sbi.lds
new file mode 100644
index 000000000..a65b27181
--- /dev/null
+++ b/src/arch/riscv/scripts/sbi.lds
@@ -0,0 +1,119 @@
+/*
+ * Linker script for RISC-V SBI images
+ *
+ */
+
+SECTIONS {
+
+ /* Start at virtual address zero */
+ . = 0;
+
+ /* Weak symbols that need zero values if not otherwise defined */
+ .weak 0x0 : {
+ _weak = .;
+ *(.weak)
+ *(.weak.*)
+ _eweak = .;
+ }
+ _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );
+
+ /* Prefix code */
+ .prefix : {
+ _prefix = .;
+ *(.prefix)
+ *(.prefix.*)
+ _eprefix = .;
+ }
+
+ /* Program code */
+ .text : {
+ _text = .;
+ *(.text)
+ *(.text.*)
+ _etext = .;
+ }
+
+ /* Align to page size to allow linker to generate W^X segments */
+ . = ALIGN ( 4096 );
+
+ /* Read-only data */
+ .rodata : {
+ _rodata = .;
+ *(.rodata)
+ *(.rodata.*)
+ _erodata = .;
+ }
+
+ /* Writable data */
+ .data : {
+ _data = .;
+ *(.data)
+ *(.data.*)
+ KEEP(*(SORT(.tbl.*))) /* Various tables. See include/tables.h */
+ KEEP(*(.provided))
+ KEEP(*(.provided.*))
+ _edata = .;
+ }
+
+ /* Uninitialised and discardable data */
+ OVERLAY : {
+
+ /* Runtime relocations (discarded after use) */
+ .rela.dyn {
+ _reloc = .;
+ *(.rela)
+ *(.rela.dyn)
+ }
+
+ /* Compressor information block */
+ .zinfo {
+ _zinfo = .;
+ KEEP(*(.zinfo))
+ KEEP(*(.zinfo.*))
+ _ezinfo = .;
+ }
+
+ /* Uninitialised data */
+ .bss {
+ _bss = .;
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ *(.stack)
+ *(.stack.*)
+ /* Align to allow for easy zeroing by prefix code */
+ . = ALIGN ( 16 );
+ _ebss = .;
+ }
+ }
+
+ /* Calculate end of relocations
+ *
+ * This cannot be done by placing "_ereloc = .;" inside the
+ * .rela.dyn section, since the dynamic relocations are not
+ * present in the input sections but are instead generated during
+ * linking.
+ */
+ _ereloc = ( _reloc + __load_stop_reladyn - __load_start_reladyn );
+
+ /* Length of initialised data */
+ _sbi_filesz = ABSOLUTE ( _ereloc );
+
+ /* Unwanted sections */
+ /DISCARD/ : {
+ *(.comment)
+ *(.comment.*)
+ *(.note)
+ *(.note.*)
+ *(.eh_frame)
+ *(.eh_frame.*)
+ *(.dynamic)
+ *(.dynsym)
+ *(.dynstr)
+ *(.einfo)
+ *(.einfo.*)
+ *(.discard)
+ *(.discard.*)
+ *(.pci_devlist.*)
+ }
+}