1OUTPUT_ARCH( "riscv" ) 2ENTRY(_start) 3 4MEMORY 5{ 6 /* ram for stack */ 7 STACK(xrw) : ORIGIN = 0x100000,LENGTH = 8K 8 /* ram for common bss and data */ 9 SRAM(xrw) : ORIGIN = 0x100000+8K,LENGTH = 8K 10 /* ram for fix rom bss and data */ 11 ROM_BSS_DATA(rx): ORIGIN = 0x100000+16K,LENGTH = 2K 12 /* ram for code rom bss and data */ 13 CODE_ROM_BSS_DATA(rx): ORIGIN = 0x100000+18K,LENGTH = 2K 14 /* ram for heap */ 15 HEAP(xrw): ORIGIN = 0x100000+20K,LENGTH = 20K 16 /* ram for loaderboot */ 17 LOADER_BOOT_ADDR(rx): ORIGIN = 0x100000+40K+0x040,LENGTH = 80K 18 /* rom for fixed rom */ 19 FIXED_ROM_ADDR(rx): ORIGIN = 0x00000000+11K,LENGTH = 21K 20 /* rom for code rom */ 21 CODE_ROM_ADDR(rx): ORIGIN = 0x003b8000+278K,LENGTH = 10K 22} 23 24STACK_SIZE = 6k; 25NMI_STACK_SIZE = 2K; 26 27SECTIONS 28{ 29 /* The startup code goes first into FLASH */ 30 .text.entry : ALIGN(4) 31 { 32 KEEP(*(.text.entry)) 33 } > LOADER_BOOT_ADDR 34 35 .rom.text : 36 { 37 . = ALIGN(4); 38 KEEP(SORT(libbase.o)(.text*)) 39 KEEP(SORT(libbase.o)(.rodata*)) 40 . = ALIGN(4); 41 } > FIXED_ROM_ADDR 42 43 .rom.code.text : 44 { 45 . = ALIGN(4); 46 KEEP(SORT(libcodebase.o)(.text*)) 47 KEEP(SORT(libcodebase.o)(.rodata*)) 48 . = ALIGN(4); 49 } > CODE_ROM_ADDR 50 51 /* Stack in SRAM at Highest addresses */ 52 .stacks (NOLOAD) : 53 { 54 . = ALIGN(4); 55 __SYSTEM_STACK_BEGIN__ = ORIGIN(STACK); 56 KEEP(*(.stacks)) 57 __SYSTEM_STACK_END__ = ORIGIN(STACK) + STACK_SIZE; 58 . = ALIGN(0x20); 59 __nmi_stack_bottom = .; 60 . += NMI_STACK_SIZE; 61 __nmi_stack_top = .; 62 } > STACK 63 __SYSTEM_STACK_SIZE__ = __SYSTEM_STACK_END__ - __SYSTEM_STACK_BEGIN__; 64 __stack_top = __SYSTEM_STACK_END__; 65 66 .rom.data : 67 { 68 . = ALIGN(4); 69 __rom_copy_start = LOADADDR(.rom.data); 70 . = ALIGN(4); 71 __rom_copy_ram_start = .; 72 __global_pointer$ = .; 73 KEEP(SORT(libbase.o) (.data*)) 74 . = ALIGN(4); 75 __rom_copy_ram_end = .; 76 } > ROM_BSS_DATA AT>FIXED_ROM_ADDR 77 __rom_copy_size = __rom_copy_ram_end - __rom_copy_ram_start; 78 79 .rom.code.data : 80 { 81 . = ALIGN(4); 82 __code_rom_copy_start = LOADADDR(.rom.code.data); 83 . = ALIGN(4); 84 __code_rom_copy_ram_start = .; 85 KEEP(SORT(libcodebase.o) (.data*)) 86 . = ALIGN(4); 87 __code_rom_copy_ram_end = .; 88 }>CODE_ROM_BSS_DATA AT>CODE_ROM_ADDR 89 __code_rom_copy_size = __code_rom_copy_ram_end - __code_rom_copy_ram_start; 90 91 .rom.bss : 92 { 93 . = ALIGN(4); 94 __rom_bss_start = .; 95 KEEP(libbase.o (.bss)) 96 KEEP(libbase.o (.bss*)) 97 KEEP(libbase.o (COMMON)) 98 . = ALIGN(4); 99 __rom_bss_end = .; 100 } > ROM_BSS_DATA AT>FIXED_ROM_ADDR 101 102 .rom.code.bss : 103 { 104 . = ALIGN(4); 105 __code_rom_bss_start = .; 106 KEEP(libcodebase.o (.bss)) 107 KEEP(libcodebase.o (.bss*)) 108 KEEP(libcodebase.o (COMMON)) 109 . = ALIGN(4); 110 __code_rom_bss_end = .; 111 }>CODE_ROM_BSS_DATA AT>CODE_ROM_ADDR 112 113 .text : ALIGN(4) 114 { 115 __start_addr = .; 116 *(.text*) 117 *(.ram.text*) 118 . = ALIGN(4); 119 __rodata_start = .; 120 *(.rodata*) 121 . = ALIGN(4); 122 __rodata_end = .; 123 __text_end = .; 124 } > LOADER_BOOT_ADDR 125 126 /* data section */ 127 .data : ALIGN(4) 128 { 129 __data_load = LOADADDR(.data); 130 __data_start = .; 131 *(.data*) 132 . = ALIGN(4); 133 __data_end = .; 134 } > LOADER_BOOT_ADDR 135 136 /* bss section */ 137 .bss (NOLOAD) : ALIGN(4) 138 { 139 __bss_begin__ = .; 140 *(.bss*) 141 *(COMMON) 142 . = ALIGN(4); 143 __bss_end__ = .; 144 } > LOADER_BOOT_ADDR 145 __bss_size__ = __bss_end__ - __bss_begin__; 146 147 .heap (NOLOAD) : 148 { 149 . = ALIGN(4); 150 __heap_begin__ = ORIGIN(HEAP); 151 KEEP(*(.heap)) 152 __heap_end__ = __heap_begin__ + LENGTH(HEAP); 153 } > HEAP 154} 155