| /* Simple linker script for the ROS kernel. |
| See the GNU ld 'info' manual ("info ld") to learn the syntax. */ |
| |
| /* This script needs to be invoked with -z max-page-size=0x1000. Otherwise, |
| * ld will offset our first section to 1MB within the actual file. Multiboot |
| * requires the header to be in the first two pages. */ |
| |
| OUTPUT_FORMAT("elf64-x86-64", "elf64-x86-64", "elf64-x86-64") |
| ENTRY(_start) |
| KERN_LOAD_ADDR = 0xffffffffc0000000; |
| |
| SECTIONS |
| { |
| /* Entry Linked and loaded at 0x00100000 (includes multiboot) */ |
| . = 0x00100000; |
| |
| .bootstrap : { |
| *(.boottext .bootdata .bootbss) |
| } |
| |
| /* Needed this for syslinux, which was sitting around 16MB phys. This |
| * just jumps us forward to the 32MB mark, both physically and |
| * virtually. */ |
| . = 0x02000000; |
| |
| /* Link the main kernel for the space after entry + KERN_LOAD_ADDR. |
| * We'll still load it adjacent in physical memory */ |
| . += KERN_LOAD_ADDR; |
| |
| .text : AT(ADDR(.text) - KERN_LOAD_ADDR) { |
| *(.text .stub .text.* .gnu.linkonce.t.*) |
| /* Define the 'etext' symbol to this value */ |
| PROVIDE(etext = .); |
| } |
| |
| INCLUDE kern/linker_tables.ld |
| INCLUDE kern/build_id.ld |
| |
| .rodata : { |
| *(.rodata .rodata.* .gnu.linkonce.r.*) |
| } |
| |
| /* Adjust the address for the data segment to the next page */ |
| . = ALIGN(0x1000); |
| |
| /* The data segment */ |
| .data : { |
| *(.data) |
| } |
| |
| .bss : { |
| PROVIDE(__start_bss = .); |
| *(.bss) |
| *(COMMON) |
| PROVIDE(__stop_bss = .); |
| } |
| |
| /* 'end' isn't a real section, but everything needs a name. It'll show |
| * up as 'N' (debug) in the nm / ksyms.map output. */ |
| .end : { |
| PROVIDE(end = .); |
| } |
| |
| /DISCARD/ : { |
| *(.eh_frame .note.GNU-stack) |
| } |
| } |