aboutsummaryrefslogtreecommitdiff
path: root/pk/pk.ld
diff options
context:
space:
mode:
Diffstat (limited to 'pk/pk.ld')
-rw-r--r--pk/pk.ld186
1 files changed, 186 insertions, 0 deletions
diff --git a/pk/pk.ld b/pk/pk.ld
new file mode 100644
index 0000000..f1ec715
--- /dev/null
+++ b/pk/pk.ld
@@ -0,0 +1,186 @@
+OUTPUT_ARCH( "mips:riscv" )
+
+ENTRY( __start )
+
+GROUP( -lc -lgloss -lgcc )
+
+
+SECTIONS
+{
+
+ /*--------------------------------------------------------------------*/
+ /* Code and read-only segment */
+ /*--------------------------------------------------------------------*/
+
+ /* Begining of code and text segment */
+ . = 0x00000000;
+ .boottext :
+ {
+ *(.boottext)
+ }
+
+ . = 0x70000000;
+ _ftext = .;
+ PROVIDE( eprol = . );
+
+ /* text: Program code section */
+ .text :
+ {
+ *(.text)
+ *(.text.*)
+ *(.gnu.linkonce.t.*)
+ }
+
+ /* init: Code to execute before main (called by crt1.S) */
+ .init :
+ {
+ KEEP( *(.init) )
+ }
+
+ /* fini: Code to execute after main (called by crt1.S) */
+ .fini :
+ {
+ KEEP( *(.fini) )
+ }
+
+ /* rodata: Read-only data */
+ .rodata :
+ {
+ *(.rdata)
+ *(.rodata)
+ *(.rodata.*)
+ *(.gnu.linkonce.r.*)
+ }
+
+ /* End of code and read-only segment */
+ PROVIDE( etext = . );
+ _etext = .;
+
+ /*--------------------------------------------------------------------*/
+ /* Global constructor/destructor segement */
+ /*--------------------------------------------------------------------*/
+ /* The .ctors/.dtors sections are special sections which contain a
+ list of constructor/destructor function pointers. crtbegin.o
+ includes code in a .init section which goes through the .ctors list
+ and calls each constuctor. crtend.o includes code in a .fini
+ section which goes through the .dtors list and calls each
+ destructor. crtbegin.o includes a special null pointer in its own
+ .ctors/.dtors sections which acts as a start indicator for those
+ lists. crtend.o also includes a special null pointer in its own
+ .ctors/.dtors sections which acts as an end indictor. The linker
+ commands below are setup so that crtbegin.o's .ctors/.dtors
+ sections are always first and crtend.o's .ctors/.dtors sections are
+ always last. This is the only way the list of functions will have
+ the begin and end indicators in the right place. */
+
+ /* ctors : Array of global constructor function pointers */
+ .ctors :
+ {
+ KEEP( *crtbegin.o(.ctors) )
+ KEEP( *(EXCLUDE_FILE(*crtend.o) .ctors) )
+ KEEP( *(SORT(.ctors.*)) )
+ KEEP( *(.ctors) )
+ }
+
+ /* dtors : Array of global destructor function pointers */
+ .dtors :
+ {
+ KEEP( *crtbegin.o(.dtors) )
+ KEEP( *(EXCLUDE_FILE(*crtend.o) .dtors) )
+ KEEP( *(SORT(.dtors.*)) )
+ KEEP( *(.dtors) )
+ }
+
+ /*--------------------------------------------------------------------*/
+ /* Other misc gcc segments (this was in idt32.ld) */
+ /*--------------------------------------------------------------------*/
+ /* I am not quite sure about these sections but it seems they are for
+ C++ exception handling. I think .jcr is for "Java Class
+ Registration" but it seems to end up in C++ binaries as well. */
+
+ .eh_frame_hdr : { *(.eh_frame_hdr) }
+ .eh_frame : { KEEP( *(.eh_frame) ) }
+ .gcc_except_table : { *(.gcc_except_table) }
+ .jcr : { KEEP (*(.jcr)) }
+
+ /*--------------------------------------------------------------------*/
+ /* Initialized data segment */
+ /*--------------------------------------------------------------------*/
+
+ /* Start of initialized data segment */
+ . = ALIGN(16);
+ _fdata = .;
+
+ /* data: Writable data */
+ .data :
+ {
+ *(.data)
+ *(.data.*)
+ *(.gnu.linkonce.d.*)
+ }
+
+ /* lit4: Single precision floating point constants created by gas */
+ .lit4 :
+ {
+ *(.lit4)
+ }
+
+ /* lit8: Double precision floating point constants created by gas */
+ .lit8 :
+ {
+ *(.lit8)
+ }
+
+ /* End of initialized data segment */
+ . = ALIGN(4);
+ PROVIDE( edata = . );
+ _edata = .;
+
+ /*--------------------------------------------------------------------*/
+ /* Uninitialized data segment */
+ /*--------------------------------------------------------------------*/
+
+ /* Start of uninitialized data segment */
+ . = .;
+ _fbss = .;
+
+ /* sbss: Uninitialized writeable small data section */
+ . = .;
+ _sbss_start = .;
+ .sbss :
+ {
+ *(.sbss)
+ *(.sbss.*)
+ *(.gnu.linkonce.sb.*)
+ *(.scommon)
+ }
+
+ /* bss: Uninitialized writeable data section */
+ . = .;
+ _bss_start = .;
+ .bss :
+ {
+ *(.bss)
+ *(.bss.*)
+ *(.gnu.linkonce.b.*)
+ *(COMMON)
+ }
+
+ /* End of uninitialized data segment (used by syscalls.c for heap) */
+ PROVIDE( end = . );
+ _end = .;
+
+ /*--------------------------------------------------------------------*/
+ /* Special gcc sections (this was in idt32.ld) */
+ /*--------------------------------------------------------------------*/
+
+ .mdebug.abi32 0 : { KEEP(*(.mdebug.abi32)) }
+ .mdebug.abiN32 0 : { KEEP(*(.mdebug.abiN32)) }
+ .mdebug.abi64 0 : { KEEP(*(.mdebug.abi64)) }
+ .mdebug.abiO64 0 : { KEEP(*(.mdebug.abiO64)) }
+ .mdebug.eabi32 0 : { KEEP(*(.mdebug.eabi32)) }
+ .mdebug.eabi64 0 : { KEEP(*(.mdebug.eabi64)) }
+ .gcc_compiled_long32 0 : { KEEP(*(.gcc_compiled_long32)) }
+ .gcc_compiled_long64 0 : { KEEP(*(.gcc_compiled_long64)) }
+
+}