diff -puN makedumpfile.org/diskdump_mod.h makedumpfile/diskdump_mod.h
--- makedumpfile.org/diskdump_mod.h	2006-09-14 18:11:07.000000000 +0900
+++ makedumpfile/diskdump_mod.h	2006-09-14 18:13:26.000000000 +0900
@@ -20,8 +20,9 @@
 #define round(x, y)	(((x) / (y)) * (y))
 
 #define DUMP_PARTITION_SIGNATURE	"diskdump"
-#define SIG_LEN (sizeof(DUMP_PARTITION_SIGNATURE) - 1)
 #define DISK_DUMP_SIGNATURE		"DISKDUMP"
+#define KDUMP_SIGNATURE			"KDUMP   "
+#define SIG_LEN (sizeof(DUMP_PARTITION_SIGNATURE) - 1)
 
 #define DUMP_HEADER_COMPLETED	0
 #define DUMP_HEADER_INCOMPLETED 1
@@ -37,7 +38,7 @@ struct new_utsname {
 };
 
 struct disk_dump_header {
-	char			signature[SIG_LEN];	/* = "DISKDUMP" */
+	char			signature[SIG_LEN];	/* = "KDUMP   " */
 	int			header_version; /* Dump header version */
 	struct new_utsname	utsname;	/* copy of system_utsname */
 	struct timeval		timestamp;	/* Time stamp */
@@ -58,8 +59,12 @@ struct disk_dump_header {
 	struct task_struct	*tasks[0];
 };
 
-struct disk_dump_sub_header {
-	long		elf_regs;
+/*
+ * Sub header for KDUMP
+ * But Common header of KDUMP is disk_dump_header of diskdump.
+ */
+struct kdump_sub_header {
+	unsigned long	phys_base;
 };
 
 /* page flags */
Common subdirectories: makedumpfile.org/dwarfinfo and makedumpfile/dwarfinfo
diff -puN makedumpfile.org/makedumpfile.c makedumpfile/makedumpfile.c
--- makedumpfile.org/makedumpfile.c	2006-09-14 18:11:07.000000000 +0900
+++ makedumpfile/makedumpfile.c	2006-09-14 18:11:18.000000000 +0900
@@ -718,6 +718,8 @@ get_symbol_info(struct DumpInfo *info)
 	unsigned long sym_pkmap_count_next = NOT_FOUND_SYMBOL;
 	unsigned long sym_system_utsname = NOT_FOUND_SYMBOL;
 	unsigned long sym__stext = NOT_FOUND_SYMBOL;
+	unsigned long sym__text = NOT_FOUND_SYMBOL;
+	unsigned long sym_phys_base = NOT_FOUND_SYMBOL;
 	char buf[BUFSIZE_FGETS], *mapitems[MAXARGS], *endp;
 
 	if (info->name_sysmap == NULL) {
@@ -788,12 +790,32 @@ get_symbol_info(struct DumpInfo *info)
 				return FALSE;
 			}
 		}
+		if (strcmp(mapitems[2], "_text") == 0) {
+			sym__text = strtoul(mapitems[0], &endp, 16);
+			if ((!sym__text || sym__text == ULONG_MAX)
+			    || strlen(endp) != 0) {
+				ERRMSG("The map file has invalid address of %s",
+				    mapitems[2]);
+				return FALSE;
+			}
+		}
+		if (strcmp(mapitems[2], "phys_base") == 0) {
+			sym_phys_base = strtoul(mapitems[0], &endp, 16);
+			if ((!sym_phys_base || sym_phys_base == ULONG_MAX)
+			    || strlen(endp) != 0) {
+				ERRMSG("The map file has invalid address of %s",
+				    mapitems[2]);
+				return FALSE;
+			}
+		}
 		if ((sym_mem_map != NOT_FOUND_SYMBOL)
 		    && (sym_mem_section != NOT_FOUND_SYMBOL)
 		    && (sym_pkmap_count != NOT_FOUND_SYMBOL)
 		    && (sym_pkmap_count_next != NOT_FOUND_SYMBOL)
 		    && (sym_system_utsname != NOT_FOUND_SYMBOL)
-		    && (sym__stext != NOT_FOUND_SYMBOL))
+		    && (sym__stext != NOT_FOUND_SYMBOL)
+		    && (sym__text != NOT_FOUND_SYMBOL)
+		    && (sym_phys_base != NOT_FOUND_SYMBOL))
 			break;
 	}
 	SYMBOL(mem_map) = sym_mem_map;
@@ -802,6 +824,8 @@ get_symbol_info(struct DumpInfo *info)
 	SYMBOL(pkmap_count_next) = sym_pkmap_count_next;
 	SYMBOL(system_utsname) = sym_system_utsname;
 	SYMBOL(_stext) = sym__stext;
+	SYMBOL(_text) = sym__text;
+	SYMBOL(phys_base) = sym_phys_base;
 
 	return TRUE;
 }
@@ -966,6 +990,8 @@ generate_config(struct DumpInfo *info)
 	WRITE_SYMBOL("pkmap_count_next", pkmap_count_next);
 	WRITE_SYMBOL("system_utsname", system_utsname);
 	WRITE_SYMBOL("_stext", _stext);
+	WRITE_SYMBOL("_text", _text);
+	WRITE_SYMBOL("phys_base", phys_base);
 
 	/*
 	 * write the structure size of 1st kernel
@@ -1092,6 +1118,8 @@ read_config(struct DumpInfo *info)
 	READ_SYMBOL("pkmap_count_next", pkmap_count_next);
 	READ_SYMBOL("system_utsname", system_utsname);
 	READ_SYMBOL("_stext", _stext);
+	READ_SYMBOL("_text", _text);
+	READ_SYMBOL("phys_base", phys_base);
 
 	READ_STRUCTURE_SIZE("page", page);
 	READ_STRUCTURE_SIZE("mem_section", mem_section);
@@ -2059,9 +2087,13 @@ write_diskdump_header(struct DumpInfo *i
 {
 	size_t size;
 	struct disk_dump_header *dh = info->dump_header;
+	struct kdump_sub_header sub_dump_header;
 	const off_t failed = (off_t)-1;
 
-	strcpy(dh->signature, DISK_DUMP_SIGNATURE);
+	/*
+	 * Write common header
+	 */
+	strcpy(dh->signature, KDUMP_SIGNATURE);
 	dh->block_size   = info->page_size;
 	dh->sub_hdr_size = 1;
 	dh->max_mapnr    = info->max_mapnr;
@@ -2080,6 +2112,23 @@ write_diskdump_header(struct DumpInfo *i
 		    info->name_dumpfile, strerror(errno));
 		return FALSE;
 	}
+
+	/*
+	 * Write sub header
+	 */
+	sub_dump_header.phys_base = info->phys_base;
+	if (lseek(info->fd_dumpfile, dh->block_size, SEEK_SET) == failed) {
+		ERRMSG("Can't seek the dump file(%s). %s\n",
+		    info->name_dumpfile, strerror(errno));
+		return FALSE;
+	}
+	size = sizeof(struct kdump_sub_header);
+	if (write(info->fd_dumpfile, &sub_dump_header, size) != size) {
+		ERRMSG("Can't write the dump file(%s). %s\n",
+		    info->name_dumpfile, strerror(errno));
+		return FALSE;
+	}
+
 	info->offset_bitmap1
 	    = (1 + dh->sub_hdr_size) * dh->block_size;
 
diff -puN makedumpfile.org/makedumpfile.h makedumpfile/makedumpfile.h
--- makedumpfile.org/makedumpfile.h	2006-09-14 18:11:07.000000000 +0900
+++ makedumpfile/makedumpfile.h	2006-09-14 18:11:18.000000000 +0900
@@ -274,6 +274,7 @@ do { \
 
 #ifdef __x86_64__
 #define PAGE_OFFSET		(0xffff810000000000)
+#define __START_KERNEL_map	(0xffffffff80000000)
 #define VMALLOC_START		(0xffffc20000000000)
 #define VMALLOC_END		(0xffffe1ffffffffff)
 #define MODULES_VADDR		(0xffffffff88000000)
@@ -353,6 +354,7 @@ struct DumpInfo {
 	unsigned int	max_mapnr;           /* number of page descriptor */
 	unsigned long   section_size_bits;
 	unsigned long   sections_per_root;
+	unsigned long	phys_base;
 
 	/*
 	 * diskdimp info:
@@ -361,7 +363,6 @@ struct DumpInfo {
 	off_t		offset_bitmap1;
 	unsigned long	len_bitmap;          /* size of bitmap(1st and 2nd) */
 	struct disk_dump_header		*dump_header; 
-	struct disk_dump_sub_header	*dump_sub_header; 
 
 	/*
 	 * ELF header info:
@@ -417,6 +418,8 @@ struct symbol_table {
 	unsigned long	pkmap_count_next;
 	unsigned long	system_utsname;
 	unsigned long	_stext;
+	unsigned long	_text;
+	unsigned long	phys_base;
 };
 
 struct size_table {
diff -puN makedumpfile.org/x86_64.c makedumpfile/x86_64.c
--- makedumpfile.org/x86_64.c	2006-09-14 18:11:07.000000000 +0900
+++ makedumpfile/x86_64.c	2006-09-14 18:11:18.000000000 +0900
@@ -34,8 +34,34 @@ is_vmalloc_addr(ulong vaddr)
 int
 get_machdep_info_x86_64(struct DumpInfo *info)
 {
+	int i;
+	struct pt_load_segment *pls;
+
 	info->section_size_bits = _SECTION_SIZE_BITS;
 
+	/*
+	 * Get the relocatable offset
+	 */
+	info->phys_base = 0; /* default/traditional */
+
+	if (SYMBOL(phys_base) == NOT_FOUND_SYMBOL)
+                return TRUE;
+
+	if (SYMBOL(_text) == NOT_FOUND_SYMBOL)
+                return TRUE;
+
+	for (i = 0; i < info->num_load_memory; i++) {
+		pls = &info->pt_load_segments[i];
+		if ((pls->virt_start >= __START_KERNEL_map) &&
+		    !(is_vmalloc_addr(pls->virt_start))) {
+
+			info->phys_base = pls->phys_start -
+			    (pls->virt_start & ~(__START_KERNEL_map));
+
+			break;
+                }
+        }
+
 	return TRUE;
 }
 
