Index: kernel/arch/ia32/_link.ld.in
===================================================================
--- kernel/arch/ia32/_link.ld.in	(revision 156bae23d90e738aa7e8674de24d66abefb19cef)
+++ kernel/arch/ia32/_link.ld.in	(revision 87db87943a5878f620f970eb966f7b70dfd211f2)
@@ -23,27 +23,37 @@
 	kernel_load_address = PA2KA(BOOT_OFFSET);
 
-	.ap_bootstrap (AP_BOOT_OFFSET): AT (AP_BOOT_OFFSET) {
-		ap_bootstrap_start = .;
+	. = AP_BOOT_OFFSET + SIZEOF_HEADERS;
 
-		/* Must be first. */
-		*(.multiboot);
+	/* Must be first. */
+	.multiboot : { *(.multiboot); } :ap_boot
 
+	ap_bootstrap_start = .;
+
+	.ap_bootstrap : {
 		*(K_AP_TEXT_START);
 		*(K_AP_DATA_START);
-		ap_bootstrap_end = .;
 	} :ap_boot
 
-	.unmapped (BOOT_OFFSET): AT (BOOT_OFFSET) {
-		unmapped_start = .;
+	ap_bootstrap_end = .;
+
+	. = BOOT_OFFSET + (ap_bootstrap_end & (PAGE_SIZE-1));
+	unmapped_start = .;
+
+	.unmapped : {
 		*(K_TEXT_START);
 		*(K_DATA_START);
-		unmapped_end = .;
 	} :unmapped
+
+	unmapped_file_end = .;
 
 	.unmapped_bss : {
 		*(.bootstack);
+		*(K_BSS_START);
 	} :unmapped
 
-	.mapped (PA2KA(BOOT_OFFSET) + SIZEOF(.unmapped) + SIZEOF(.unmapped_bss)): AT (BOOT_OFFSET + SIZEOF(.unmapped) + SIZEOF(.unmapped_bss)) {
+	unmapped_end = .;
+	mapped_load_start = ALIGN(PAGE_SIZE) + (unmapped_file_end & (PAGE_SIZE-1));
+
+	.mapped (PA2KA(mapped_load_start)): AT (mapped_load_start) {
 		ktext_start = .;
 		*(.text .text.*);
Index: kernel/arch/ia32/src/boot/multiboot.S
===================================================================
--- kernel/arch/ia32/src/boot/multiboot.S	(revision 156bae23d90e738aa7e8674de24d66abefb19cef)
+++ kernel/arch/ia32/src/boot/multiboot.S	(revision 87db87943a5878f620f970eb966f7b70dfd211f2)
@@ -597,5 +597,5 @@
 	ret
 
-.section K_DATA_START, "aw", @progbits
+.section K_BSS_START, "aw", @nobits
 
 .align 4096
@@ -607,20 +607,22 @@
 	.long 0
 
+SYMBOL(multiboot_eax)
+	.long 0
+
+SYMBOL(multiboot_ebx)
+	.long 0
+
+pt_loc:
+	.long 0
+kernel_end:
+	.long 0
+free_area:
+	.long 0
+
+.section K_DATA_START, "aw", @progbits
+
 SYMBOL(bootstrap_gdtr)
 	.word GDT_SELECTOR(GDT_ITEMS)
 	.long KA2PA(gdt)
-
-SYMBOL(multiboot_eax)
-	.long 0
-
-SYMBOL(multiboot_ebx)
-	.long 0
-
-pt_loc:
-	.long 0
-kernel_end:
-	.long 0
-free_area:
-	.long 0
 
 status_prot:
