Index: arch/amd64/_link.ld
===================================================================
--- arch/amd64/_link.ld	(revision 7df54dfbadf9cb199bd5b3a268869566c733e2bb)
+++ arch/amd64/_link.ld	(revision 32f6e1bd789d689430ed7f05425fd6aac36b89f0)
@@ -25,4 +25,5 @@
 	.mapped (0xffffffff80000000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) {
 		ktext_start = .;
+		*(BOOT_DATA);
 		*(.text);
 		ktext_end = .;
@@ -43,3 +44,6 @@
 		kdata_end = .;
 	}
+	_map_address = 0xffffffff80000000;
+	e820table_boot = e820table - _map_address;
+	e820counter_boot = e820counter - _map_address;
 }
Index: arch/ia32/_link.ld
===================================================================
--- arch/ia32/_link.ld	(revision 7df54dfbadf9cb199bd5b3a268869566c733e2bb)
+++ arch/ia32/_link.ld	(revision 32f6e1bd789d689430ed7f05425fd6aac36b89f0)
@@ -25,4 +25,5 @@
 	.mapped (0x80100000+SIZEOF(.unmapped)+0x8000) : AT (0x8000+SIZEOF(.unmapped)) { 
 		ktext_start = .;
+		*(BOOT_DATA)
 		*(.text);
 		ktext_end = .;
@@ -44,4 +45,7 @@
 	
 	_hardcoded_kernel_size = (ktext_end - ktext_start) + (unmapped_ktext_end - unmapped_ktext_start) + (kdata_end - kdata_start) + (unmapped_kdata_end - unmapped_kdata_start);
-	
+
+	_map_address = 0x80100000;
+	e820table_boot = e820table - _map_address;
+	e820counter_boot = e820counter - _map_address;
 }
Index: arch/ia32/src/boot/memmap.S
===================================================================
--- arch/ia32/src/boot/memmap.S	(revision 7df54dfbadf9cb199bd5b3a268869566c733e2bb)
+++ arch/ia32/src/boot/memmap.S	(revision 32f6e1bd789d689430ed7f05425fd6aac36b89f0)
@@ -35,6 +35,4 @@
 
 .global memmap_arch_init
-.global e820counter
-.global e820table
 .global e801memorysize
 
@@ -48,6 +46,6 @@
 	movw	%bx,%ds
 	movw	%bx,%es
-	movw	$e820table,%di
-	movb	$E820_MAX_RECORDS,e820counter
+	movw	$e820table_boot,%di
+	movb	$E820_MAX_RECORDS,e820counter_boot
 e820loop:	
 	movl	$E820_SMAP,%edx 	# control sequence "SMAP"
@@ -68,5 +66,5 @@
 	movw	%ax,%di
 		
-	decb	e820counter # buffer is full
+	decb	e820counter_boot # buffer is full
 	jz	e820end
 	
@@ -76,11 +74,11 @@
 e820end:
 	movb	$E820_MAX_RECORDS,%al
-	subb	e820counter,%al
-	movb	%al,e820counter # store # of valid entries in e820counter
+	subb	e820counter_boot,%al
+	movb	%al,e820counter_boot # store # of valid entries in e820counter
 
 	jmp	e801begin
 
 e820err:
-	movb	$0,e820counter
+	movb	$0,e820counter_boot
 
 # method e801 - get size of memory
@@ -118,8 +116,3 @@
 e801memorysize:
 	.long	0
-
-e820counter:
-	.byte 0xff
-
-e820table:
-	.space  (32*E820_RECORD_SIZE),0xff # space for 32 records, each E820_RECORD_SIZE bytes long
+	
Index: arch/ia32/src/mm/memory_init.c
===================================================================
--- arch/ia32/src/mm/memory_init.c	(revision 7df54dfbadf9cb199bd5b3a268869566c733e2bb)
+++ arch/ia32/src/mm/memory_init.c	(revision 32f6e1bd789d689430ed7f05425fd6aac36b89f0)
@@ -32,4 +32,7 @@
 #include <print.h>
 
+__u8 e820counter __attribute__ ((section ("BOOT_DATA"))) = 0xff;
+struct e820memmap_ e820table[MEMMAP_E820_MAX_RECORDS] __attribute__ ((section ("BOOT_DATA"))) ;
+
 size_t get_memory_size(void) 
 {
@@ -41,14 +44,7 @@
 	__u8 i;
 	
-	/*
-	 * We must not work with the original addresses for they are not mapped anymore.
-	 */
-	struct e820memmap_ *memtable = (struct e820memmap_ *) PA2KA(e820table);
-	__u32 *counter_p = (__u32 *) PA2KA(&e820counter);
-	
-	
-	for (i=*counter_p;i>0;i--) {
-		printf("E820 base: %Q size: %Q type: ", memtable[i-1].base_address, memtable[i-1].size);
-		switch (memtable[i-1].type) {
+	for (i=e820counter;i>0;i--) {
+		printf("E820 base: %Q size: %Q type: ", e820table[i-1].base_address, e820table[i-1].size);
+		switch (e820table[i-1].type) {
 			case MEMMAP_MEMORY_AVAILABLE: 
 				printf("available memory\n");
Index: src/build.amd64
===================================================================
--- src/build.amd64	(revision 7df54dfbadf9cb199bd5b3a268869566c733e2bb)
+++ src/build.amd64	(revision 32f6e1bd789d689430ed7f05425fd6aac36b89f0)
@@ -10,11 +10,15 @@
 cd ../arch
 for a in drivers bios mm/frame.c mm/tlb.c mm/memory_init.c boot/memmap.S; do
-  echo ln -sf `pwd`/ia32/src/$a amd64/src/$a
-  ln -sf `pwd`/ia32/src/$a amd64/src/$a
+  if [ \! -e amd64/src/$a ]; then
+    echo ln -sf `pwd`/ia32/src/$a amd64/src/$a
+    ln -sf `pwd`/ia32/src/$a amd64/src/$a
+  fi
 done
 
 for a in ega.h i8042.h i8259.h i8254.h interrupt.h bios mm/memory_init.h; do
-  echo ln -sf `pwd`/ia32/include/$a amd64/include/$a
-  ln -sf `pwd`/ia32/include/$a amd64/include/$a
+  if [ \! -e amd64/include/$a ]; then
+    echo ln -sf `pwd`/ia32/include/$a amd64/include/$a
+    ln -sf `pwd`/ia32/include/$a amd64/include/$a
+  fi
 done
 )
