Index: arch/amd64/Makefile.inc
===================================================================
--- arch/amd64/Makefile.inc	(revision 824553ed5cc61c86404a9202494044984c500319)
+++ arch/amd64/Makefile.inc	(revision ae9624e37a2173ed74af117513e1012d6450bb20)
@@ -6,4 +6,5 @@
 AS=$(AMD64_BINUTILS_DIR)/$(AMD64_TARGET)-as
 LD=$(AMD64_BINUTILS_DIR)/$(AMD64_TARGET)-ld
+OBJDUMP=$(AMD64_BINUTILS_DIR)/$(AMD64_TARGET)-objdump
 OBJCOPY=$(AMD64_BINUTILS_DIR)/$(AMD64_TARGET)-objcopy
 BFD_NAME=elf64-x86-64
Index: arch/amd64/src/boot/boot.S
===================================================================
--- arch/amd64/src/boot/boot.S	(revision 824553ed5cc61c86404a9202494044984c500319)
+++ arch/amd64/src/boot/boot.S	(revision ae9624e37a2173ed74af117513e1012d6450bb20)
@@ -158,5 +158,5 @@
 	.fill 509,8,0
 	.quad ptl_2 + (PTL_WRITABLE | PTL_PRESENT)
-	.fill 2,8,0
+	.fill 1,8,0
 	
 .align 4096
Index: arch/ia32/Makefile.inc
===================================================================
--- arch/ia32/Makefile.inc	(revision 824553ed5cc61c86404a9202494044984c500319)
+++ arch/ia32/Makefile.inc	(revision ae9624e37a2173ed74af117513e1012d6450bb20)
@@ -2,4 +2,5 @@
 AS=as
 LD=ld
+OBJDUMP=objdump
 OBJCOPY=objcopy
 BFD_NAME=elf32-i386
Index: arch/ia64/Makefile.inc
===================================================================
--- arch/ia64/Makefile.inc	(revision 824553ed5cc61c86404a9202494044984c500319)
+++ arch/ia64/Makefile.inc	(revision ae9624e37a2173ed74af117513e1012d6450bb20)
@@ -7,4 +7,5 @@
 AS=$(IA-64_BINUTILS_DIR)/$(IA-64_TARGET)-as
 LD=$(IA-64_BINUTILS_DIR)/$(IA-64_TARGET)-ld
+OBJDUMP=$(IA-64_BINUTILS_DIR)/$(IA-64_TARGET)-objdump
 OBJCOPY=$(IA-64_BINUTILS_DIR)/$(IA-64_TARGET)-objcopy
 BFD_NAME=elf64-little
Index: arch/mips/Makefile.inc
===================================================================
--- arch/mips/Makefile.inc	(revision 824553ed5cc61c86404a9202494044984c500319)
+++ arch/mips/Makefile.inc	(revision ae9624e37a2173ed74af117513e1012d6450bb20)
@@ -7,4 +7,5 @@
 AS=$(MIPS_BINUTILS_DIR)/$(MIPS_TARGET)-as
 LD=$(MIPS_BINUTILS_DIR)/$(MIPS_TARGET)-ld
+OBJDUMP=$(MIPS_BINUTILS_DIR)/$(MIPS_TARGET)-objdump
 OBJCOPY=$(MIPS_BINUTILS_DIR)/$(MIPS_TARGET)-objcopy
 BFD_NAME=elf32-tradlittlemips
Index: arch/ppc/Makefile.inc
===================================================================
--- arch/ppc/Makefile.inc	(revision 824553ed5cc61c86404a9202494044984c500319)
+++ arch/ppc/Makefile.inc	(revision ae9624e37a2173ed74af117513e1012d6450bb20)
@@ -7,4 +7,5 @@
 AS=$(PPC_BINUTILS_DIR)/$(PPC_TARGET)-as
 LD=$(PPC_BINUTILS_DIR)/$(PPC_TARGET)-ld
+OBJDUMP=$(PPC_BINUTILS_DIR)/$(PPC_TARGET)-objdump
 OBJCOPY=$(PPC_BINUTILS_DIR)/$(PPC_TARGET)-objcopy
 BFD_NAME=elf32-powerpc
Index: src/Makefile
===================================================================
--- src/Makefile	(revision 824553ed5cc61c86404a9202494044984c500319)
+++ src/Makefile	(revision ae9624e37a2173ed74af117513e1012d6450bb20)
@@ -66,5 +66,5 @@
 clean:
 	find . ../arch/$(ARCH)/src ../test -name '*.o' -exec rm \{\} \;
-	-rm *.bin kernel.map kernel.map.pre debug/real_map.bin
+	-rm *.bin kernel.map kernel.map.pre kernel.objdump debug/real_map.bin
 	$(MAKE) -C ../arch/$(ARCH)/boot clean
 
@@ -74,9 +74,15 @@
 	-$(MAKE) clean
 
-kernel.bin: $(arch_objects) $(objects) $(test_objects) ../arch/$(ARCH)/_link.ld
+debug/real_map.bin: $(arch_objects) $(objects) $(test_objects) ../arch/$(ARCH)/_link.ld 
 	$(OBJCOPY) -I binary -O $(BFD_NAME) -B $(BFD_ARCH) --prefix-sections=symtab Makefile debug/empty_map.o
 	$(LD) -T ../arch/$(ARCH)/_link.ld $(LFLAGS) $(arch_objects) $(objects) $(test_objects) debug/empty_map.o -o $@ -Map kernel.map.pre
-	../tools/genmap.py kernel.map.pre debug/real_map.bin
-	$(OBJCOPY) -I binary -O $(BFD_NAME) -B $(BFD_ARCH) --prefix-sections=symtab debug/real_map.bin debug/real_map.o
+	$(OBJDUMP) -t $(arch_objects) $(objects) $(test_objects) > kernel.objdump
+	../tools/genmap.py kernel.map.pre kernel.objdump debug/real_map.bin 
+
+debug/real_map.o: debug/real_map.bin
+	$(OBJCOPY) -I binary -O $(BFD_NAME) -B $(BFD_ARCH) --prefix-sections=symtab $< $@
+
+
+kernel.bin: $(arch_objects) $(objects) $(test_objects) ../arch/$(ARCH)/_link.ld debug/real_map.o
 	$(LD) -T ../arch/$(ARCH)/_link.ld $(LFLAGS) $(arch_objects) $(objects) $(test_objects) debug/real_map.o -o $@ -Map kernel.map
 
Index: tools/genmap.py
===================================================================
--- tools/genmap.py	(revision 824553ed5cc61c86404a9202494044984c500319)
+++ tools/genmap.py	(revision ae9624e37a2173ed74af117513e1012d6450bb20)
@@ -5,61 +5,59 @@
 import re
 
-symline = re.compile(r'(0x[a-f0-9]+)\s+([^\s]+)$')
-fileline = re.compile(r'[^\s]+\s+0x[a-f0-9]+\s+0x[a-f0-9]+\s+([^\s]+\.o)$')
-
 MAXSTRING=63
 symtabfmt = "<Q%ds" % (MAXSTRING+1)
 
-def read_symbols(inp):
-    while 1:
-        line = inp.readline()
-        if not line:
-            return
-        if 'memory map' in line:
-            break        
 
-    symtable = {}
-    filename = ''
-    while 1:
-        line = inp.readline()
-        if not line.strip():
+objline = re.compile(r'([0-9a-f]+)\s+[lg]\s+F\s+\.text\s+[0-9a-f]+\s+(.*)$')
+fileexp = re.compile(r'([^\s]+):\s+file format')
+def read_obdump(inp):
+    result = {}
+    fname = ''
+    for line in inp:
+        line = line.strip()
+        res = objline.match(line)
+        if res:
+            result.setdefault(fname,[]).append((int(res.group(1),16),
+                                                 res.group(2)))
+        res = fileexp.match(line)
+        if res:
+            fname = res.group(1)
             continue
-        if line[0] not in (' ','.'):
-            break
+    
+    return result
+
+startfile = re.compile(r'\.text\s+(0x[0-9a-f]+)\s+0x[0-9a-f]+\s+(.*)$')
+def generate(kmapf, obmapf, out):
+    obdump = read_obdump(obmapf)
+
+    def sorter(x,y):
+        return cmp(x[0],y[0])
+
+    for line in kmapf:
         line = line.strip()
-        # Search for file name
-        res = fileline.match(line)
-        if res:
-            filename = res.group(1)
-        # Search for symbols
-        res = symline.match(line)
-        if res:
-            symtable[int(res.group(1),16)] = filename + ':' + res.group(2)
-    return symtable
-    
-def generate(inp, out):
-    symtab = read_symbols(inp)
-    if not symtab:
-        print "Bad kernel.map format, empty."
-        sys.exit(1)
-    addrs = symtab.keys()
-    addrs.sort()
-    for addr in addrs:
-        # Do not write address 0, it indicates end of data
-        if addr == 0:
-            continue
-        data = struct.pack(symtabfmt,addr,symtab[addr][:MAXSTRING])
-        out.write(data)
+        res = startfile.match(line)
+        if res and obdump.has_key(res.group(2)):
+            offset = int(res.group(1),16)
+            fname = res.group(2)
+            symbols = obdump[fname]
+            symbols.sort(sorter)
+            for addr,symbol in symbols:
+                value = fname + ':' + symbol
+                data = struct.pack(symtabfmt,addr+offset,value[:MAXSTRING])
+                out.write(data)
+                
     out.write(struct.pack(symtabfmt,0,''))
 
 def main():
-    if len(sys.argv) != 3:
-        print "Usage: %s <kernel.map> <output.bin>" % sys.argv[0]
+    if len(sys.argv) != 4:
+        print "Usage: %s <kernel.map> <nm dump> <output.bin>" % sys.argv[0]
         sys.exit(1)
 
-    inp = open(sys.argv[1],'r')
-    out = open(sys.argv[2],'w')
-    generate(inp,out)
-    inp.close()
+    kmapf = open(sys.argv[1],'r')
+    obmapf = open(sys.argv[2],'r')
+    out = open(sys.argv[3],'w')
+    generate(kmapf,obmapf,out)
+    kmapf.close()
+    obmapf.close()
     out.close()
 
