diff -urN -X dontdiff linux/fs/proc/kcore.c 2327-p2-kcore/fs/proc/kcore.c
--- linux/fs/proc/kcore.c	Tue Nov  9 08:34:43 1999
+++ 2327-p2-kcore/fs/proc/kcore.c	Tue Nov  9 10:11:03 1999
@@ -143,7 +143,7 @@
  * store an ELF coredump header in the supplied buffer
  * - assume the memory image is the size specified
  */
-static void elf_kcore_store_hdr(char *bufp, size_t size, off_t dataoff)
+static void elf_kcore_store_hdr(char *bufp)
 {
 	struct elf_prstatus prstatus;	/* NT_PRSTATUS */
 	struct elf_prpsinfo psinfo;	/* NT_PRPSINFO */
@@ -154,65 +154,86 @@
 
 	/* acquire an ELF header block from the buffer */
 	elf = (struct elfhdr *) bufp;
-	bufp += sizeof(*elf);
-	offset += sizeof(*elf);
+	bufp += sizeof(struct elfhdr);
+	offset += sizeof(struct elfhdr);
 
 	/* set up header */
 	memcpy(elf->e_ident,ELFMAG,SELFMAG);
 	elf->e_ident[EI_CLASS]	= ELF_CLASS;
 	elf->e_ident[EI_DATA]	= ELF_DATA;
 	elf->e_ident[EI_VERSION]= EV_CURRENT;
-	memset(elf->e_ident+EI_PAD,0,EI_NIDENT-EI_PAD);
+	memset(elf->e_ident+EI_PAD, 0, EI_NIDENT-EI_PAD);
 
 	elf->e_type	= ET_CORE;
 	elf->e_machine	= ELF_ARCH;
 	elf->e_version	= EV_CURRENT;
 	elf->e_entry	= 0;
-	elf->e_phoff	= sizeof(*elf);
+	elf->e_phoff	= sizeof(struct elfhdr);
 	elf->e_shoff	= 0;
 	elf->e_flags	= 0;
-	elf->e_ehsize	= sizeof(*elf);
+	elf->e_ehsize	= sizeof(struct elfhdr);
 	elf->e_phentsize= sizeof(struct elf_phdr);
-	elf->e_phnum	= 2;			/* no. of segments */
+	elf->e_phnum	= 1;	/* no. of segments  = 1 + Nmodules */
 	elf->e_shentsize= 0;
 	elf->e_shnum	= 0;
 	elf->e_shstrndx	= 0;
 
 	/* acquire an ELF program header blocks from the buffer for notes */
 	nhdr = (struct elf_phdr *) bufp;
-	bufp += sizeof(*nhdr);
-	offset += sizeof(*nhdr);
+	bufp += sizeof(struct elf_phdr);
+	offset += sizeof(struct elf_phdr);
 
 	/* store program headers for notes dump */
 	nhdr->p_type	= PT_NOTE;
 	nhdr->p_offset	= 0;
 	nhdr->p_vaddr	= 0;
 	nhdr->p_paddr	= 0;
+	nhdr->p_filesz	= 0;
 	nhdr->p_memsz	= 0;
 	nhdr->p_flags	= 0;
 	nhdr->p_align	= 0;
 
 	/* acquire an ELF program header blocks from the buffer for data */
 	dhdr = (struct elf_phdr *) bufp;
-	bufp += sizeof(*dhdr);
-	offset += sizeof(*dhdr);
+	bufp += sizeof(struct elf_phdr);
+	offset += sizeof(struct elf_phdr);
 
 	/* store program headers for data dump */
 	dhdr->p_type	= PT_LOAD;
 	dhdr->p_flags	= PF_R|PF_W|PF_X;
-	dhdr->p_offset	= dataoff;
+	dhdr->p_offset	= PAGE_SIZE;
 	dhdr->p_vaddr	= PAGE_OFFSET;
 	dhdr->p_paddr	= __pa(PAGE_OFFSET);
-	dhdr->p_filesz	= size;
-	dhdr->p_memsz	= size;
+	dhdr->p_filesz	= ((unsigned long)high_memory - PAGE_OFFSET + PAGE_SIZE);
+	dhdr->p_memsz	= ((unsigned long)high_memory - PAGE_OFFSET + PAGE_SIZE);
 	dhdr->p_align	= PAGE_SIZE;
 
+#ifdef CONFIG_MODULES
+	{
+		struct module *m;
+		for (m=module_list; m; m=m->next) {
+			dhdr = (struct elf_phdr *) bufp;
+			bufp += sizeof(struct elf_phdr);
+			offset += sizeof(struct elf_phdr);
+
+			dhdr->p_type	= PT_LOAD;
+			dhdr->p_flags	= PF_R|PF_W|PF_X;
+			dhdr->p_offset	= (unsigned long)m - PAGE_OFFSET + PAGE_SIZE;
+			dhdr->p_vaddr	= (unsigned long)m;
+			dhdr->p_paddr	= __pa(m);
+			dhdr->p_filesz	= m->size;
+			dhdr->p_memsz	= m->size;
+			dhdr->p_align	= 0;
+			elf->e_phnum++;
+		}
+	}
+#endif
+
 	/*
 	 * Set up the notes in similar form to SVR4 core dumps made
 	 * with info from their /proc.
 	 */
 	nhdr->p_offset	= offset;
-	nhdr->p_filesz	= 0;
 
 	/* set up the process status */
 	notes[0].name = "CORE";
@@ -289,7 +310,7 @@
 
 		/* create a header */
 		memset(page,0,PAGE_SIZE);
-		elf_kcore_store_hdr(page,size-PAGE_SIZE,PAGE_SIZE);
+		elf_kcore_store_hdr(page);
 
 		/* copy data to the users buffer */
 		copy_to_user(buffer,page,tsz);
