| /* | |
| * init::start will pass stacktop to setup() as the base of free memory. | |
| * setup() will then move the FDT and initrd to that base before calling | |
| * mem_init(). With those movements and this linker script, we'll end up | |
| * having the following memory layout: | |
| * | |
| * +----------------------+ <-- top of physical memory | |
| * | | | |
| * ~ ~ | |
| * | | | |
| * +----------------------+ <-- top of initrd | |
| * | | | |
| * +----------------------+ <-- top of FDT | |
| * | | | |
| * +----------------------+ <-- top of cpu0's stack | |
| * | | | |
| * +----------------------+ <-- top of text/data/bss sections | |
| * | | | |
| * | | | |
| * +----------------------+ <-- load address | |
| * | | | |
| * +----------------------+ <-- physical address 0x0 | |
| */ | |
| PHDRS | |
| { | |
| text PT_LOAD FLAGS(5); | |
| data PT_LOAD FLAGS(6); | |
| } | |
| SECTIONS | |
| { | |
| PROVIDE(ImageBase = .); | |
| PROVIDE(_text = .); | |
| .text : { *(.init) *(.text) *(.text.*) } :text | |
| . = ALIGN(4K); | |
| PROVIDE(_etext = .); | |
| PROVIDE(reloc_start = .); | |
| .rela.dyn : { *(.rela.dyn) } | |
| PROVIDE(reloc_end = .); | |
| .dynsym : { *(.dynsym) } | |
| .dynstr : { *(.dynstr) } | |
| .hash : { *(.hash) } | |
| .gnu.hash : { *(.gnu.hash) } | |
| .got : { *(.got) *(.got.plt) } | |
| .eh_frame : { *(.eh_frame) } | |
| .rodata : { *(.rodata*) } :data | |
| .data : { *(.data) } :data | |
| . = ALIGN(16); | |
| PROVIDE(bss = .); | |
| .bss : { *(.bss) } | |
| . = ALIGN(16); | |
| PROVIDE(ebss = .); | |
| . = ALIGN(4K); | |
| PROVIDE(edata = .); | |
| /* | |
| * stack depth is 8K and sp must be 16 byte aligned | |
| * sp must always be strictly less than the true stacktop | |
| */ | |
| . += 12K; | |
| . = ALIGN(4K); | |
| PROVIDE(stackptr = . - 16); | |
| PROVIDE(stacktop = .); | |
| /DISCARD/ : { | |
| *(.note*) | |
| *(.interp) | |
| *(.comment) | |
| *(.dynamic) | |
| } | |
| } | |
| ENTRY(start) |