Index: kernel/arch/amd64/_link.ld.in
===================================================================
--- kernel/arch/amd64/_link.ld.in	(revision de96d3bfc2010ce18fdf8d42328d4c461d7ca3f2)
+++ kernel/arch/amd64/_link.ld.in	(revision 6677acb49e48af821edea6da80b06fe4a5b68dba)
@@ -23,18 +23,36 @@
 	}
 
-	.mapped (PA2KA(BOOT_OFFSET) + SIZEOF_HEADERS + SIZEOF(.unmapped)) : AT (BOOT_OFFSET + SIZEOF_HEADERS + SIZEOF(.unmapped)) {
+	.text (PA2KA(BOOT_OFFSET) + SIZEOF_HEADERS + SIZEOF(.unmapped)) : AT (BOOT_OFFSET + SIZEOF_HEADERS + SIZEOF(.unmapped)) {
 		ktext_start = .;
 		*(.text .text.*);
 		ktext_end = .;
+	}
 
+	/* stack unwinding data */
+	.eh_frame_hdr : {
+		eh_frame_hdr_start = .;
+		*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*);
+		eh_frame_hdr_end = .;
+	}
+	.eh_frame : {
+		eh_frame_start = .;
+		KEEP(*(.eh_frame .eh_frame.*));
+		eh_frame_end = .;
+	}
+
+	.data : {
 		kdata_start = .;
-		*(.data .data.*);              /* initialized data */
-		*(.rodata .rodata.*);
-		*(.eh_frame .eh_frame.*);      /* stack unwinding data */
-		*(.eh_frame_hdr .eh_frame_hdr.*);
-		*(COMMON);      /* global variables */
+		*(.rodata .rodata.*);  /* read-only global variables */
+		*(.data .data.*);      /* non-zero initialized global variables */
 
-		/* bss can't be omitted from the ELF image. */
-		*(.bss .bss.*);        /* uninitialized static variables */
+		/*
+		 * When .bss is not physically present in the ELF file (MemSz > FileSz)
+		 * the kernel crashes during early boot. Not sure which part of the
+		 * boot process is to blame, for now just keep .bss packaged with .data
+		 * so that FileSz == MemSz.
+		 */
+
+		 *(.bss .bss.*);        /* uninitialized global variables */
+		*(COMMON);             /* non-`static` global variables without an extern declaration */
 		kdata_end = .;
 	}
Index: kernel/arch/arm32/_link.ld.in
===================================================================
--- kernel/arch/arm32/_link.ld.in	(revision de96d3bfc2010ce18fdf8d42328d4c461d7ca3f2)
+++ kernel/arch/arm32/_link.ld.in	(revision 6677acb49e48af821edea6da80b06fe4a5b68dba)
@@ -26,4 +26,5 @@
 	kernel_load_address = .;
 	. = . + SIZEOF_HEADERS;
+
 	.text : {
 		ktext_start = .;
@@ -31,4 +32,18 @@
 		ktext_end = .;
 	}
+
+	/* stack unwinding data */
+	.eh_frame_hdr : {
+		eh_frame_hdr_start = .;
+		*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*);
+		eh_frame_hdr_end = .;
+	}
+
+	.eh_frame : {
+		eh_frame_start = .;
+		KEEP(*(.eh_frame .eh_frame.*));
+		eh_frame_end = .;
+	}
+
 	.data : {
 		kdata_start = .;
@@ -38,14 +53,9 @@
 
 		*(.rodata .rodata.*);
-		*(.eh_frame .eh_frame.*);       /* stack unwinding data */
-		*(.eh_frame_hdr .eh_frame_hdr.*);
 		*(.sdata .sdata.*);
-	}
-	.sbss : {
 		*(.sbss .sbss.*);
 		*(.scommon .scommon.*);
+		kdata_end = .;
 	}
-
-	kdata_end = .;
 
 	.comment 0 : { *(.comment); }
Index: kernel/arch/arm64/_link.ld.in
===================================================================
--- kernel/arch/arm64/_link.ld.in	(revision de96d3bfc2010ce18fdf8d42328d4c461d7ca3f2)
+++ kernel/arch/arm64/_link.ld.in	(revision 6677acb49e48af821edea6da80b06fe4a5b68dba)
@@ -19,5 +19,5 @@
 	kernel_load_address = LOAD_ADDRESS_V;
 
-	.image (LOAD_ADDRESS_V + SIZEOF_HEADERS) : AT (LOAD_ADDRESS_P + SIZEOF_HEADERS) {
+	.text (LOAD_ADDRESS_V + SIZEOF_HEADERS) : AT (LOAD_ADDRESS_P + SIZEOF_HEADERS) {
 		. = ALIGN(16);
 		ktext_start = .;
@@ -25,15 +25,26 @@
 		*(.text .text.*);
 		ktext_end = .;
+	}
 
+	/* stack unwinding data */
+	.eh_frame_hdr : {
+		eh_frame_hdr_start = .;
+		*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*);
+		eh_frame_hdr_end = .;
+	}
+
+	.eh_frame : {
+		eh_frame_start = .;
+		KEEP(*(.eh_frame .eh_frame.*));
+		eh_frame_end = .;
+	}
+
+	.data : {
 		kdata_start = .;
 		KEEP(*(K_DATA_START))
+		*(.rodata .rodata.*);
 		*(.data .data.*);                       /* initialized data */
 		*(.bss .bss.*);                        /* uninitialized static variables */
 		*(COMMON);                      /* global variables */
-
-		*(.rodata .rodata.*);
-		*(.eh_frame .eh_frame.*);       /* stack unwinding data */
-		*(.eh_frame_hdr .eh_frame_hdr.*);
-
 		kdata_end = .;
 	}
Index: kernel/arch/ia32/_link.ld.in
===================================================================
--- kernel/arch/ia32/_link.ld.in	(revision de96d3bfc2010ce18fdf8d42328d4c461d7ca3f2)
+++ kernel/arch/ia32/_link.ld.in	(revision 6677acb49e48af821edea6da80b06fe4a5b68dba)
@@ -22,18 +22,36 @@
 	}
 
-	.mapped (PA2KA(BOOT_OFFSET) + SIZEOF_HEADERS + SIZEOF(.unmapped)): AT (BOOT_OFFSET + SIZEOF_HEADERS + SIZEOF(.unmapped)) {
+	.text (PA2KA(BOOT_OFFSET) + SIZEOF_HEADERS + SIZEOF(.unmapped)): AT (BOOT_OFFSET + SIZEOF_HEADERS + SIZEOF(.unmapped)) {
 		ktext_start = .;
 		*(.text .text.*);
 		ktext_end = .;
+	}
 
+	/* stack unwinding data */
+	.eh_frame_hdr : {
+		eh_frame_hdr_start = .;
+		*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*);
+		eh_frame_hdr_end = .;
+	}
+	.eh_frame : {
+		eh_frame_start = .;
+		KEEP(*(.eh_frame .eh_frame.*));
+		eh_frame_end = .;
+	}
+
+	.data : {
 		kdata_start = .;
-		*(.data .data.*);               /* initialized data */
-		*(.rodata .rodata.*);
-		*(.eh_frame .eh_frame.*);       /* stack unwinding data */
-		*(.eh_frame_hdr .eh_frame_hdr.*);
-		*(COMMON);              /* global variables */
+		*(.rodata .rodata.*);  /* read-only global variables */
+		*(.data .data.*);      /* non-zero initialized global variables */
 
-		/* bss can't be omitted from the ELF image. */
-		*(.bss .bss.*);                /* uninitialized static variables */
+		/*
+		 * When .bss is not physically present in the ELF file (MemSz > FileSz)
+		 * the kernel crashes during early boot. Not sure which part of the
+		 * boot process is to blame, for now just keep .bss packaged with .data
+		 * so that FileSz == MemSz.
+		 */
+
+		 *(.bss .bss.*);        /* uninitialized global variables */
+		*(COMMON);             /* non-`static` global variables without an extern declaration */
 		kdata_end = .;
 	}
Index: kernel/arch/ia64/_link.ld.in
===================================================================
--- kernel/arch/ia64/_link.ld.in	(revision de96d3bfc2010ce18fdf8d42328d4c461d7ca3f2)
+++ kernel/arch/ia64/_link.ld.in	(revision 6677acb49e48af821edea6da80b06fe4a5b68dba)
@@ -15,5 +15,5 @@
 	kernel_load_address = LOAD_ADDRESS_V;
 
-	.image (LOAD_ADDRESS_V + SIZEOF_HEADERS): AT (LOAD_ADDRESS_P + SIZEOF_HEADERS) {
+	.text (LOAD_ADDRESS_V + SIZEOF_HEADERS): AT (LOAD_ADDRESS_P + SIZEOF_HEADERS) {
 		. = ALIGN(16);
 		ktext_start = .;
@@ -21,10 +21,23 @@
 		*(.text .text.*)
 		ktext_end = .;
+	}
 
+	/* stack unwinding data */
+	.eh_frame_hdr : {
+		eh_frame_hdr_start = .;
+		*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*);
+		eh_frame_hdr_end = .;
+	}
+
+	.eh_frame : {
+		eh_frame_start = .;
+		KEEP(*(.eh_frame .eh_frame.*));
+		eh_frame_end = .;
+	}
+	
+	.data : {
 		kdata_start = .;
 		KEEP(*(K_DATA_START));
 		*(.rodata .rodata.*);
-		*(.eh_frame .eh_frame.*);       /* stack unwinding data */
-		*(.eh_frame_hdr .eh_frame_hdr.*);
 		*(.opd)
 		*(.data .data.*)
Index: kernel/arch/mips32/_link.ld.in
===================================================================
--- kernel/arch/mips32/_link.ld.in	(revision de96d3bfc2010ce18fdf8d42328d4c461d7ca3f2)
+++ kernel/arch/mips32/_link.ld.in	(revision 6677acb49e48af821edea6da80b06fe4a5b68dba)
@@ -33,10 +33,22 @@
 		ktext_end = .;
 	}
+
+	/* stack unwinding data */
+	.eh_frame_hdr : {
+		eh_frame_hdr_start = .;
+		*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*);
+		eh_frame_hdr_end = .;
+	}
+
+	.eh_frame : {
+		eh_frame_start = .;
+		KEEP(*(.eh_frame .eh_frame.*));
+		eh_frame_end = .;
+	}
+
 	.data : {
 		kdata_start = .;
 		*(.data .data.*);                       /* initialized data */
 		*(.rodata .rodata.*);
-		*(.eh_frame .eh_frame.*);       /* stack unwinding data */
-		*(.eh_frame_hdr .eh_frame_hdr.*);
 		*(.sdata .sdata.*);
 		*(.reginfo);
@@ -46,4 +58,5 @@
 		*(COMMON);                      /* global variables */
 	}
+
 	_gp = . + 0x8000;
 	.lit8 : { *(.lit8) }
Index: kernel/arch/ppc32/_link.ld.in
===================================================================
--- kernel/arch/ppc32/_link.ld.in	(revision de96d3bfc2010ce18fdf8d42328d4c461d7ca3f2)
+++ kernel/arch/ppc32/_link.ld.in	(revision 6677acb49e48af821edea6da80b06fe4a5b68dba)
@@ -25,15 +25,28 @@
 	}
 
-	.mapped PA2KA(BOOT_OFFSET): AT (BOOT_OFFSET) {
+	.text PA2KA(BOOT_OFFSET): AT (BOOT_OFFSET) {
 		ktext_start = .;
 		KEEP(*(K_TEXT_START));
 		*(.text .text.*);
 		ktext_end = .;
+	}
 
+	/* stack unwinding data */
+	.eh_frame_hdr : {
+		eh_frame_hdr_start = .;
+		*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*);
+		eh_frame_hdr_end = .;
+	}
+
+	.eh_frame : {
+		eh_frame_start = .;
+		KEEP(*(.eh_frame .eh_frame.*));
+		eh_frame_end = .;
+	}
+
+	.data : {
 		kdata_start = .;
 		KEEP(*(K_DATA_START));
 		*(.rodata .rodata.*);
-		*(.eh_frame .eh_frame.*);       /* stack unwinding data */
-		*(.eh_frame_hdr .eh_frame_hdr.*);
 		*(.data .data.*);       /* initialized data */
 		*(.sdata .sdata.*);
Index: kernel/arch/riscv64/_link.ld.in
===================================================================
--- kernel/arch/riscv64/_link.ld.in	(revision de96d3bfc2010ce18fdf8d42328d4c461d7ca3f2)
+++ kernel/arch/riscv64/_link.ld.in	(revision 6677acb49e48af821edea6da80b06fe4a5b68dba)
@@ -16,15 +16,28 @@
 	kernel_load_address = PA2KA(BOOT_OFFSET);
 
-	.image (PA2KA(BOOT_OFFSET) + SIZEOF_HEADERS) : AT (BOOT_OFFSET + SIZEOF_HEADERS) {
+	.text (PA2KA(BOOT_OFFSET) + SIZEOF_HEADERS) : AT (BOOT_OFFSET + SIZEOF_HEADERS) {
 		ktext_start = .;
 		KEEP(*(K_TEXT_START));
 		*(.text .text.*);
 		ktext_end = .;
+	}
 
+	/* stack unwinding data */
+	.eh_frame_hdr : {
+		eh_frame_hdr_start = .;
+		*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*);
+		eh_frame_hdr_end = .;
+	}
+
+	.eh_frame : {
+		eh_frame_start = .;
+		KEEP(*(.eh_frame .eh_frame.*));
+		eh_frame_end = .;
+	}
+
+	.data : {
 		kdata_start = .;
 		*(.data .data.*);                       /* initialized data */
 		*(.rodata .rodata.*);
-		*(.eh_frame .eh_frame.*);       /* stack unwinding data */
-		*(.eh_frame_hdr .eh_frame_hdr.*);
 		*(.sdata .sdata.*);
 		*(.sbss .sbss.*);
Index: kernel/arch/sparc64/_link.ld.in
===================================================================
--- kernel/arch/sparc64/_link.ld.in	(revision de96d3bfc2010ce18fdf8d42328d4c461d7ca3f2)
+++ kernel/arch/sparc64/_link.ld.in	(revision 6677acb49e48af821edea6da80b06fe4a5b68dba)
@@ -14,15 +14,28 @@
 	kernel_load_address = VMA;
 
-	.image (VMA + SIZEOF_HEADERS): AT (LMA + SIZEOF_HEADERS) {
+	.text (VMA + SIZEOF_HEADERS): AT (LMA + SIZEOF_HEADERS) {
 		ktext_start = .;
 		KEEP(*(K_TEXT_START));
 		*(.text .text.*);
 		ktext_end = .;
+	}
 
+	/* stack unwinding data */
+	.eh_frame_hdr : {
+		eh_frame_hdr_start = .;
+		*(.eh_frame_hdr) *(.eh_frame_entry .eh_frame_entry.*);
+		eh_frame_hdr_end = .;
+	}
+
+	.eh_frame : {
+		eh_frame_start = .;
+		KEEP(*(.eh_frame .eh_frame.*));
+		eh_frame_end = .;
+	}
+
+	.data : {
 		kdata_start = .;
 		KEEP(*(K_DATA_START));
 		*(.rodata .rodata.*);
-		*(.eh_frame .eh_frame.*);       /* stack unwinding data */
-		*(.eh_frame_hdr .eh_frame_hdr.*);
 		*(.data .data.*);                   /* initialized data */
 		*(.sdata .sdata.*);
