xref: /xv6-public/kernel.ld (revision f043ac66)
167d4254dSFrans Kaashoek/* Simple linker script for the JOS kernel.
267d4254dSFrans Kaashoek   See the GNU ld 'info' manual ("info ld") to learn the syntax. */
367d4254dSFrans Kaashoek
467d4254dSFrans KaashoekOUTPUT_FORMAT("elf32-i386", "elf32-i386", "elf32-i386")
567d4254dSFrans KaashoekOUTPUT_ARCH(i386)
667d4254dSFrans KaashoekENTRY(_start)
767d4254dSFrans Kaashoek
867d4254dSFrans KaashoekSECTIONS
967d4254dSFrans Kaashoek{
10ce6dd9deSAustin Clements	/* Link the kernel at this address: "." means the current address */
1115997d58SRobert Morris        /* Must be equal to KERNLINK */
1215997d58SRobert Morris	. = 0x80100000;
1367d4254dSFrans Kaashoek
1467d4254dSFrans Kaashoek	.text : AT(0x100000) {
1567d4254dSFrans Kaashoek		*(.text .stub .text.* .gnu.linkonce.t.*)
1667d4254dSFrans Kaashoek	}
1767d4254dSFrans Kaashoek
1867d4254dSFrans Kaashoek	PROVIDE(etext = .);	/* Define the 'etext' symbol to this value */
1967d4254dSFrans Kaashoek
2067d4254dSFrans Kaashoek	.rodata : {
2167d4254dSFrans Kaashoek		*(.rodata .rodata.* .gnu.linkonce.r.*)
2267d4254dSFrans Kaashoek	}
2367d4254dSFrans Kaashoek
2467d4254dSFrans Kaashoek	/* Include debugging information in kernel memory */
2567d4254dSFrans Kaashoek	.stab : {
2667d4254dSFrans Kaashoek		PROVIDE(__STAB_BEGIN__ = .);
2767d4254dSFrans Kaashoek		*(.stab);
2867d4254dSFrans Kaashoek		PROVIDE(__STAB_END__ = .);
2967d4254dSFrans Kaashoek	}
3067d4254dSFrans Kaashoek
3167d4254dSFrans Kaashoek	.stabstr : {
3267d4254dSFrans Kaashoek		PROVIDE(__STABSTR_BEGIN__ = .);
3367d4254dSFrans Kaashoek		*(.stabstr);
3467d4254dSFrans Kaashoek		PROVIDE(__STABSTR_END__ = .);
3567d4254dSFrans Kaashoek	}
3667d4254dSFrans Kaashoek
3767d4254dSFrans Kaashoek	/* Adjust the address for the data segment to the next page */
3867d4254dSFrans Kaashoek	. = ALIGN(0x1000);
3967d4254dSFrans Kaashoek
40*dd4438b4SAustin Clements	/* Conventionally, Unix linkers provide pseudo-symbols
41*dd4438b4SAustin Clements	 * etext, edata, and end, at the end of the text, data, and bss.
42*dd4438b4SAustin Clements	 * For the kernel mapping, we need the address at the beginning
43*dd4438b4SAustin Clements	 * of the data section, but that's not one of the conventional
44*dd4438b4SAustin Clements	 * symbols, because the convention started before there was a
45*dd4438b4SAustin Clements	 * read-only rodata section between text and data. */
46*dd4438b4SAustin Clements	PROVIDE(data = .);
47*dd4438b4SAustin Clements
4867d4254dSFrans Kaashoek	/* The data segment */
4967d4254dSFrans Kaashoek	.data : {
5067d4254dSFrans Kaashoek		*(.data)
5167d4254dSFrans Kaashoek	}
5267d4254dSFrans Kaashoek
5367d4254dSFrans Kaashoek	PROVIDE(edata = .);
5467d4254dSFrans Kaashoek
5567d4254dSFrans Kaashoek	.bss : {
5667d4254dSFrans Kaashoek		*(.bss)
5767d4254dSFrans Kaashoek	}
5867d4254dSFrans Kaashoek
5967d4254dSFrans Kaashoek	PROVIDE(end = .);
6067d4254dSFrans Kaashoek
6167d4254dSFrans Kaashoek	/DISCARD/ : {
6267d4254dSFrans Kaashoek		*(.eh_frame .note.GNU-stack)
6367d4254dSFrans Kaashoek	}
6467d4254dSFrans Kaashoek}
65