aboutsummaryrefslogtreecommitdiff
path: root/zkvms/nexus/guest/guest.ld
diff options
context:
space:
mode:
Diffstat (limited to 'zkvms/nexus/guest/guest.ld')
-rw-r--r--zkvms/nexus/guest/guest.ld73
1 files changed, 73 insertions, 0 deletions
diff --git a/zkvms/nexus/guest/guest.ld b/zkvms/nexus/guest/guest.ld
new file mode 100644
index 0000000..5a4dd4a
--- /dev/null
+++ b/zkvms/nexus/guest/guest.ld
@@ -0,0 +1,73 @@
+ENTRY(_start);
+
+SECTIONS
+{
+ /* Set the default size of the stack. */
+ /* */
+ /* Because the stack will grow down from this point, and if the heap requests memory */
+ /* being used by the stack then the runtime will panic, this value also functions as */
+ /* the memory limit for the guest program execution more generally. */
+ __memory_top = 0x6400000;
+ . = 0;
+
+ .text : ALIGN(4)
+ {
+ KEEP(*(.init));
+ . = ALIGN(4);
+ KEEP(*(.init.rust));
+ *(.text .text.*);
+ }
+
+ . = ALIGN(8);
+ . = .* 2;
+
+ .data : ALIGN(4)
+ {
+ /* Must be called __global_pointer$ for linker relaxations to work. */
+ __global_pointer$ = . + 0x800;
+ *(.srodata .srodata.*);
+ *(.rodata .rodata.*);
+ *(.sdata .sdata.* .sdata2 .sdata2.*);
+ *(.data .data.*);
+
+ /* this is used by the global allocator (see:src/lib.rs) */
+ . = ALIGN(4);
+ _heap = .;
+ LONG(_ebss);
+ }
+
+ .bss (NOLOAD) : ALIGN(4)
+ {
+ *(.sbss .sbss.* .bss .bss.*);
+ . = ALIGN(4);
+ _ebss = .;
+ _end = .;
+ }
+
+ /* Dynamic relocations are unsupported. This section is only used to detect
+ relocatable code in the input files and raise an error if relocatable code
+ is found */
+ .got (INFO) :
+ {
+ KEEP(*(.got .got.*));
+ }
+
+ /DISCARD/ :
+ {
+ *(.comment*)
+ *(.debug*)
+ }
+
+ /* Stack unwinding is not supported, but we will keep these for now */
+ .eh_frame (INFO) : { KEEP(*(.eh_frame)) }
+ .eh_frame_hdr (INFO) : { *(.eh_frame_hdr) }
+}
+
+ASSERT(. < __memory_top, "Program is too large for the VM memory.");
+
+ASSERT(SIZEOF(.got) == 0, "
+.got section detected in the input files. Dynamic relocations are not
+supported. If you are linking to C code compiled using the `gcc` crate
+then modify your build script to compile the C code _without_ the
+-fPIC flag. See the documentation of the `gcc::Config.fpic` method for
+details.");