summaryrefslogtreecommitdiffstats
path: root/src/arch/riscv/scripts
diff options
context:
space:
mode:
Diffstat (limited to 'src/arch/riscv/scripts')
-rw-r--r--src/arch/riscv/scripts/sbi.lds133
1 files changed, 133 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..04cabcf85
--- /dev/null
+++ b/src/arch/riscv/scripts/sbi.lds
@@ -0,0 +1,133 @@
+/*
+ * Linker script for RISC-V SBI images
+ *
+ */
+
+SECTIONS {
+
+ /* Weak symbols that need zero values if not otherwise defined */
+ saved_pos = .;
+ .weak 0x0 : {
+ _weak = .;
+ *(.weak)
+ *(.weak.*)
+ _eweak = .;
+ }
+ _assert = ASSERT ( ( _weak == _eweak ), ".weak is non-zero length" );
+ _assert = ASSERT ( ( . == saved_pos ), ".weak altered current position" );
+
+ /* 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 = .;
+ *(.srodata)
+ *(.srodata.*)
+ *(.rodata)
+ *(.rodata.*)
+ _erodata = .;
+ }
+
+ /* Writable data */
+ .data : {
+ _data = .;
+ *(.sdata)
+ *(.sdata.*)
+ *(.data)
+ *(.data.*)
+ KEEP(*(SORT(.tbl.*))) /* Various tables. See include/tables.h */
+ KEEP(*(.provided))
+ KEEP(*(.provided.*))
+ *(.got)
+ *(.got.plt)
+ /* Ensure compressed relocations end up aligned */
+ . = ALIGN ( 16 );
+ _edata = .;
+ }
+
+ /* Uninitialised and discardable data */
+ OVERLAY : {
+
+ /* Runtime relocations (discarded after use) */
+ .rela.dyn {
+ *(.rela)
+ *(.rela.dyn)
+ }
+
+ /* Compressor information block */
+ .zinfo {
+ _zinfo = .;
+ KEEP(*(.zinfo))
+ KEEP(*(.zinfo.*))
+ _ezinfo = .;
+ }
+
+ /* Uninitialised data */
+ .bss {
+ _bss = .;
+ *(.sbss)
+ *(.sbss.*)
+ *(.bss)
+ *(.bss.*)
+ *(COMMON)
+ *(.stack)
+ *(.stack.*)
+ /* Align to allow for easy zeroing by prefix code */
+ . = ALIGN ( 16 );
+ _ebss = .;
+ }
+ }
+
+ /* End virtual address */
+ _end = .;
+
+ /* Base virtual address */
+ _base = ABSOLUTE ( _prefix );
+
+ /* Relocations */
+ _reloc_offset = ( LOADADDR ( .rela.dyn ) - LOADADDR ( .prefix ) );
+ _reloc_filesz = SIZEOF ( .rela.dyn );
+
+ /* Length of initialised data */
+ _filesz = ( ABSOLUTE ( _edata ) - ABSOLUTE ( _prefix ) );
+
+ /* Length of in-memory image */
+ _memsz = ( ABSOLUTE ( _end ) - ABSOLUTE ( _prefix ) );
+
+ /* Unwanted sections */
+ /DISCARD/ : {
+ *(.comment)
+ *(.comment.*)
+ *(.note)
+ *(.note.*)
+ *(.eh_frame)
+ *(.eh_frame.*)
+ *(.dynamic)
+ *(.dynsym)
+ *(.dynstr)
+ *(.hash)
+ *(.gnu.hash)
+ *(.einfo)
+ *(.einfo.*)
+ *(.discard)
+ *(.discard.*)
+ *(.pci_devlist.*)
+ }
+}