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);